Kodėl į „UITableViewStyleGrouped“ stilių „iOS7“ pridėjo papildomą „UITableView“ viršų

Pradedant nuo „iOS7“, mano UITableView viršuje yra papildoma erdvė su UITableViewStyleGrouped stiliu.

Štai pavyzdys:

2019

579
18 сент. nustatė esilveris 18 sep . 2013-09-18 22:07 '13, 10:07 pm 2013-09-18 22:07
@ 53 atsakymai
  • 1
  • 2

Radau pradinės klaidos priežastį ir parengiau pavyzdinį projektą, kad jį būtų galima parodyti. Manau, kad yra iOS7 klaida.

Kaip ir iOS7 sistemoje, jei sukursite UITableView su grupuotu stiliumi, bet neturite delegatų rinkinio pirmame išdėstyme, tada nustatysite delegatą ir skambinkite reloadData, viršuje bus 35 pikselių erdvė, kuri niekada nebus toli.

Žr. Šį projektą. Pateikiau klaidos demonstraciją: https://github.com/esilverberg/TableViewDelayedDelegateBug

Visų pirma, šis failas: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

Jei 24 eilutė aktyvi,

 [self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0]; 

viršuje bus rodoma papildoma 35 px erdvė. Jei 27 eilutė yra aktyvi ir 24 komentarai,

 self.tableView.delegate = self; 

viršutinėje vietoje nėra vietos. Tai panaši į faktą, kad lentelės rodinys talpina rezultatą kažkur ir neperplėšia pats po to, kai yra nustatytas delegatas ir vadinamas reloadData.

51
05 окт. atsakymas pateikiamas esilver 05 okt. 2013-10-05 08:52 '13, 8:52, 2013-10-05 08:52

Man padėjo:

YouStoryboard.storyboard> YouViewController> Atributo inspektorius> Išvalykite žymės >border=0

2019

01 окт. atsakymas pateikiamas Alexander 01 Oct. 2013-10-01 16:36 '13, 16:36, 2013-10-01 16:36

Aš šiek tiek žaidžiau su juo, ir atrodo, kad tai yra šalutinis poveikis, kai nustatomas tableView tableHeaderView = nil .

Kadangi mano tableView turi dinamiškai rodomą tableHeaderView kai reikia paslėpti „ tableHeaderView , o ne paleisti „ self.tableView.tableHeaderView = nil; Aš:

 self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)]; 

Man patinka šis sprendimas geriau nei nustatyti šiek tiek savavališką „ contentInset.top , nes dinamiškai naudoju „ contentInset.top . Nepamirškite pašalinti papildomo 35px, kai perskaičiuoju contentInset.top .

293
atsakymas pateikiamas p. 22 сент. T 22 rugsėjis 2013-09-22 02:33 '13, 2:33 2013-09-22 02:33

„IOS 7“, jei rodote valdiklio rodinį, galite peržiūrėti

 self.edgesForExtendedLayout = UIRectEdgeNone; 

Jūsų problema atrodė panaši į mano.

Atnaujinti:

„Swift“ į „iOS 9.x“:

 self.edgesForExtendedLayout = UIRectEdge.None 

„Swift 3“:

 self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0) 
174
21 сент. atsakymas pateikiamas 21 sek . 2013-09-21 00:16 '13 prie 0:16 2013-09-21 00:16

Pabandykite pakeisti „ contentInset nuosavybę, kurią UITableView paveldi iš „ UIScrollView .

 self.tableView.contentInset = UIEdgeInsetsMake(-36, 0, 0, 0); 

Tai yra problema, tačiau ji veikia.

157
21 сент. Atsakymas pateikiamas nvrtd frst 21 rugsėjo. 2013-09-21 20:32 '13, 8:32 pm 2013-09-21 20:32
 self.automaticallyAdjustsScrollViewInsets = NO; 

pabandykite tai, galite jį tvarkyti!

132
29 окт. atsakymas pateikiamas guanhuiwit 29 oct. 2013-10-29 05:32 '13, 5:32 2013-10-29 05:32

Galite nustatyti, ar jūsų programa veikia iOS7 ar naujesnėje versijoje, ir pridėkite šiuos du metodus prie savo lentelės rodinio delegato (paprastai UIViewController kode).

 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return CGFLOAT_MIN; } -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { return CGFLOAT_MIN; } 

Galbūt tai nėra elegantiškas sprendimas, bet jis veikia man

„Swift“ versija:

 override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return CGFloat.leastNormalMagnitude } override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return CGFloat.leastNormalMagnitude } 
65
25 окт. Atsakyti LightMan 25 sp . 2013-10-25 21:26 '13, 21:26, 2013-10-25 21:26

Nuimkite parinktį „Pritaikyti slinkties intarpus“

2019

26 авг. atsakymas duotas Tú Đt 26 rug . 2016-08-26 06:51 '16 at 6:51 am 2016-08-26 06:51

Kitas greitas komentaras ... net Xcode 6.1 yra klaida, kai vertikalios erdvės yra UIScrollViews , UITextViews ir UITableViews .

2019

45
07 янв. Atsakymą pateikė Mike Gledhill 07 Jan 2015-01-07 11:14 '15 at 11:14 2015-01-07 11:14

Pagal šį „ iOS7“ perėjimo vadovą , slinkties sąrašo sąrašai yra automatiškai sukonfigūruoti. Numatytoji reikšmė yra automatiškaiAdjustsScrollViewInsets nustatytas į YES.

UIViewController su UITableView turi nustatyti šią reikšmę į NO.

 self.automaticallyAdjustsScrollViewInsets = NO; 

Tai padarys apgauti.

1 redaguoti:

Taip pat galite pabandyti -

 self.navigationController.navigationBar.translucent = YES; 

Tai taip pat pašalina papildomą priedą viršuje.

39
15 янв. atsakymą pateikė girish_vr 15 sausis 2014-01-15 15:32 '14, 15:32 2014-01-15 15:32

Jei naudojate grupuotą lentelės peržiūrą, naudokite tai, kad išvengtumėte sienų apipjaustymo

 self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0); 
35
29 апр. atsakymą pateikė Aqib Mumtaz balandžio 29 d. 2014-04-29 13:43 '14, 13:43, 2014-04-29 13:43

Daugelis pirmiau pateiktų atsakymų yra per daug hacks. Jei „Apple“ nusprendžia ištaisyti šį netikėtą elgesį, jie bet kuriuo metu pertraukos.

Problemos priežastis:

  • UITableView nenori, kad antraštė būtų 0,0 aukščio. Jei tai, ką bandote padaryti, yra antraštė su 0 aukščiu, galite pereiti prie sprendimo.

  • net jei vėliau ant jūsų antraštės priskiriate ne 0,0 aukštį, UITableView nenori, kad pirmasis būtų priskiriamas antraštei, kurios aukštis yra 0,0.

Sprendimas:

Tada paprasčiausias ir patikimiausias taisymas yra tas, kad antraštės aukštis nėra 0, kai jį priskiriate kaip lentelę.

Kažkas panašaus veiks:

 // Replace UIView with whatever class you're using as your header below: UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)]; self.tableView.tableHeaderView = tableViewHeaderView; 

Kažkas panašaus būtų problema tam tikru momentu (paprastai po slinkimo):

 // Replace UIView with whatever class you're using as your header below: UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero]; self.tableView.tableHeaderView = tableViewHeaderView; 
32
04 июля '15 в 20:33 2015-07-04 20:33 atsakymą pateikė Aurelien Porte liepos 14 d. 15 d. 20:33 2015-07-04 20:33

„Storyboard“:

Tiesiog nuimkite žymės >Adjust Scroll View Insets peržiūros tvarkyklės nustatymuose

2019

29
21 мая '15 в 13:29 2015-05-21 13:29 atsakymas pateikiamas Bartłomiej Semańczyk gegužės 21 d., 15 val. 13:29 2015-05-21 13:29

Tai yra iOS 10 sprendimas, naudojant „Swift 3“:

Jūs galite atsikratyti viršutinių ir apatinių įtraukų, įgyvendindami šiuos metodus iš „ UITableViewDelegate .

 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return CGFloat.leastNormalMagnitude } func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return CGFloat.leastNormalMagnitude } 
17
12 янв. atsakymą pateikė AndreasLukas 12 sausis 2017-01-12 19:37 '17, 7:37 pm 2017-01-12 19:37

Mano atveju tai padėjo man. Taip pat pritariu „ios6“.

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { self.edgesForExtendedLayout = UIRectEdgeNone; self.extendedLayoutIncludesOpaqueBars = NO; self.automaticallyAdjustsScrollViewInsets = NO; } 
14
25 сент. atsakymas pateikiamas Lukas 25 sep. 2013-09-25 12:10 '13, 12:10, 2013-09-25 12:10

Tiesiog pridėkite toliau pateiktą informaciją į savo rodinįDidLoad savo VC:

 self.automaticallyAdjustsScrollViewInsets = NO; 
14
20 сент. Atsakymas suteikiamas teisepereira 20 sep . 2014-09-20 08:20 '14 at 8:20 2014-09-20 08:20

Taigi, aš čia bandžiau kiekvieną metodą, ir šį kartą nė vienas iš jų nepadėjo. Mano atvejis buvo sugrupuota lentelė „iOS 9“ sistemoje. Nežinau, kodėl ar kaip sužinojau apie tai, bet man įdiegiau tableViewHeader su UIView , kurio aukštis ne mažesnis kaip 0.01 . CGRectZero nepadėjo, niekas nepadėjo:

 tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01)) 
13
21 июля '16 в 16:07 2016-07-21 16:07 atsakymas yra suteiktas saulėtekio liepos 21 d. 16:07 2016-07-21 16:07

„Swift“: „iOS“ naršymo metu turėjau lentelės vaizdą. Kai spustelėjau „Atgal“ tame pačiame ekrane. Rodymo slinkimas užims daugiau vietos. Norėdami išspręsti šią problemą, naudoju:

  self.automaticallyAdjustsScrollViewInsets = false 

Būlio reikšmė, rodanti, ar peržiūros reguliatorius turėtų automatiškai sureguliuoti slinkties intarpus. Numatytoji reikšmė yra teisinga, todėl peržiūros valdiklis gali pritaikyti slinkties intarpus atsakydamas į ekrano sritis, kurias naudoja būsenos juosta, naršymo juosta ir įrankių juosta ar skirtukų juosta. Nustatykite reikšmę false, jei norite patys valdyti slinkties įterpimo nustatymus, pavyzdžiui, kai peržiūros hierarchijoje yra daugiau nei vienas slinkties tipas.

10
25 нояб. atsakymą pateikė Vinod Joshi lapkričio 25 d. 2014-11-25 10:20 '14, 10:20 2014-11-25 10:20

Mano atsakymas bus bendresnis atsakymas, tačiau tai taip pat gali būti taikoma šiam klausimui.

Jei šaknų sistemos ( ViewController ) arba pirmojo šakninio vaizdo vaiko ( subview ) vaizdas yra UIScrollView (arba UIScrollView) poklasis, ir

 self.navigationController.navigationBar.translucent = YES; 

Sistema automatiškai įdiegs iš anksto apskaičiuotą Inset turinį .


Norėdami to išvengti, galite tai padaryti

 self.automaticallyAdjustsScrollViewInsets = NO; 

bet mano atveju aš negalėjau to padaryti, nes įdiegiau SDK, turinčią UIView komponentą, kurį gali naudoti kiti kūrėjai. Šiame „UIView“ komponente yra „UIWebView“ (kurio pirmasis subview yra UIScrollView). Jei šis komponentas pridedamas kaip pirmasis vaikas UIViewController peržiūros hierarchijoje, sistema naudos automatinius įterpimus.

Prieš pridėdamas „UIWebView“, aš išsprendžiau šį vaizdą su rėmeliu (0,0,0,0) .

Šiuo atveju sistema nerado pirmojo subquery UIScrollView poklasio ir nenaudojo intarpų.

9
02 дек. atsakymas pateiktas zvjerka24 02 dec. 2015-12-02 17:20 '15, 17:20 2015-12-02 17:20

Atsakymas @Aurelien Porte. Čia yra mano sprendimas

Šios problemos priežastis: -

  • UITableView nenori turėti antraštę, kurios aukštis yra 0,0. Jei tai, ką bandote padaryti, yra antraštė su 0 aukščiu, galite pereiti prie sprendimo.
  • net jei vėliau ant jūsų antraštės priskiriate ne 0,0 aukštį, UITableView nenori, kad pirmasis būtų priskiriamas antraštei, kurios aukštis yra 0,0.

„ViewDidLoad“:

 self.edgesForExtendedLayout = UIRectEdge.None self.automaticallyAdjustsScrollViewInsets = false 

Nereikia kažko panašaus: -

 self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0) 

heightForHeaderInSection delegate: -

 if section == 0 { return 1 } else { return 40; // your other headers height value } 

viewForHeaderInSection delegate: -

 if section == 0 { // Note CGFloat.min for swift // For Objective-c CGFLOAT_MIN let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) return headerView } else { // Construct your other headers here } 
9
30 мая '16 в 12:42 2016-05-30 12:42 atsakymą pateikė Ashish Pisey , gegužės 30 d. 16, 12:42 2016-05-30 12:42

Manau, kad tai tik naujosios UITableViewStyleGrouped stiliaus dalis. Tai yra visose grupuotose lentelėse, ir nėra tiesioginio būdo valdyti šią erdvę.

Jei šią erdvę vaizduoja UIView , būtų galima naršyti visus subviews UITableView kad surastumėte šį konkretų vaizdą ir jį redaguotumėte tiesiogiai. Tačiau taip pat yra tikimybė, kad ši erdvė yra tiesiog pakoreguota, prieš pradedant antraštes ir ląsteles, ir nebus jokio būdo jį redaguoti.

Jei norite atlikti paiešką visuose pogrupiuose (norėčiau paleisti šį kodą, kai lentelėje nėra ląstelių, kad būtų lengviau skaityti rezultatą)

 - (void)listSubviewsOfView:(UIView *)view { // Get the subviews of the view NSArray *subviews = [view subviews]; // Return if there are no subviews if ([subviews count] == 0) return; for (UIView *subview in subviews) { NSLog(@"%@", subview); // List the subviews of subview [self listSubviewsOfView:subview]; } } 
8
18 сент. Kevino atsakymas, pateiktas rugsėjo 18 d. 2013-09-18 23:12 '13, 11:12 pm 2013-09-18 23:12

Štai kaip tai pataisyti „iOS 11“ ir „Xcode 9.1“ naudojant „storyboard“:

Pasirinkite „Žiūrėti lentelę“> „Dydžio inspektorius“> „Įterpti turinį: niekada“

8
02 нояб. Atsakymas pateikiamas Pink Panther 02 lapkričio. 2017-11-02 11:30 '17 at 11:30 2017-11-02 11:30

Turėjau tą patį pataisymą kaip arielis. Kai tik perkelsiu „UITableView“ taip, kad tai nebuvo pirmasis patronuojančio požiūrio priedas, jis buvo išnykęs. Mano erdvė buvo 20 px, o ne 35.

Aš negalėjau ją atkurti xib portretu, tik xib kraštovaizdžiu. Vėliau įrašysiu radaro klaidą, jei galėsiu ją atkurti paprastoje demonstracinėje programoje.

7
11 апр. Atsakymas pateikiamas Oded 11 Bal. 2014-04-11 10:20 '14 ne 10:20 2014-04-11 10:20

Manau, kad UIEdgeInsets -35 0 0 0 yra išsekimas. Mano atveju, aš įgyvendina tableView: heightForHeaderInSection: metodą ir jis gali grįžti į 0.

Kai pasikeitiau nuo 0 iki 0.1f, problema tiesiog išnyko.

7
03 авг. atsakymas, kurį pateikė Jiangfan Du 03 rug . 2014-08-03 02:45 '14, 2:45 val. 2014-08-03 02:45

Naudokite tai, manau, kad ši pagalba ...

  - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 0.005f;// set this according to that you want... } 
6
26 окт. atsakymą Shahzaib Maqbool pateikė spalio 26 d. 2015-10-26 14:57 '15, 14:57 2015-10-26 14:57
 override func viewWillAppear(animated: Bool) { self.edgesForExtendedLayout = UIRectEdge.None // OR self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0); //OR self.automaticallyAdjustsScrollViewInsets = false } 
6
15 апр. Atsakyti AG balandžio 15 d 2016-04-15 11:18 '16 at 11:18 2016-04-15 11:18

Vienintelis dalykas, kuris dirbo man:

Swift

 tableView.sectionHeaderHeight = 0 tableView.sectionFooterHeight = 0 

Tikslas c

 self.tableView.sectionHeaderHeight = 0; self.tableView.sectionFooterHeight = 0; 

Be to, aš vis dar turėjau daugiau vietos pirmajai daliai. Taip atsitiko todėl, kad neteisingai panaudojau tableHeaderView nuosavybę. Ištaisyta, pridedant:

 self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01)) 
5
30 дек. Atsakyti Danut Pralea 30 Dec. 2016-12-30 14:31 '17 at 14:31 pm 2016-12-30 14:31

Jei norite, kad ištęstumėte „tableviewHeader“ erdvę iš viršaus, aš padariau šiuos pakeitimus:

YouStoryboard.storyboard> YouViewController> Pasirinkite „TableView“> „Size Inspector“> „Insert Content“ - nustatykite jį niekada.

2019

14 апр. atsakymą pateikė vartotojo 832 14 balandis. 2018-04-14 15:08 '18, 15:08 2018-04-14 15:08
 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ return CGFLOAT_MIN; } 

Ką visi žmonės!

5
09 мая '16 в 19:45 2016-05-09 19:45 Atsakymą pateikė Hannah Louisa Carney gegužės 09, 16 d. 19:45 2016-05-09 19:45

Mes turime keletą atsakymų.

1) Jūs galite pridėti „UIImageview“ vaizdą didload

 UIImageView * imbBackground = [UIImageView new]; [self.view addSubview:imbBackground]; 

2) Galite nustatyti antraštės ir poraštės 0.1 aukštį

 - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { return 0.1; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ return 0.1; } 

3) Galite pridėti antraštę ir poraštę, kurios aukštis yra 0,1

 tblCampaigns.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)]; tblCampaigns.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)]; 
5
15 апр. Atsakymą Hari pateikia nuo balandžio 15 d. 2017-04-15 15:19 '17, 15:19 PM 2017-04-15 15:19
  • 1
  • 2

Kiti klausimai apie „ etiketes „ arba „ Užduoti klausimą“