Dlaczego na górze mojego UITableView znajduje się dodatkowe wypełnienie w stylu UITableViewStyleGrouped w iOS7

635

Począwszy od iOS7, u góry moich jest więcej miejsca, UITableViewktóre mają styl UITableViewStyleGrouped.

Oto przykład:

wprowadź opis zdjęcia tutaj

Widok tabeli rozpoczyna się od pierwszej strzałki, jest 35 pikseli niewyjaśnionego dopełnienia, a następnie zielony nagłówek jest UIViewzwracany przez viewForHeaderInSection(gdzie sekcja ma wartość 0).

Czy ktoś może wyjaśnić, skąd pochodzi ta liczba 35 pikseli i jak mogę się jej pozbyć bez przełączania UITableViewStylePlain?


Uwaga:

W iOS 11 i nowszych:

tableView.contentInsetAdjustmentBehavior = .never
esilver
źródło
używasz najnowszego iOS 7? Niektóre z TYPÓW niespójności (ale nie wszystkie, a być może nie ta) zostały wyleczone podczas późniejszych wersji deweloperskich. Powinienem wiedzieć: tak zwlekałem, że niektóre problemy zniknęły.
Dan Rosenstark,
Sprawdź odpowiedź tutaj - stackoverflow.com/a/18986158/1463604
Nishant
Krótka odpowiedź jest taka, że ​​to dodatkowe wypełnienie jest prawdopodobnie spowodowane nagłówkiem widoku tabeli (nie nagłówkiem sekcji) i że UITableViewnie lubi być przypisywany nagłówkowi o wysokości 0,0. Sprawdź stackoverflow.com/a/31223403/1394534, aby uzyskać więcej informacji.
Aurelien Porte
30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];Uwaga: 0.0fjest po prostu ignorowany, jeśli użyjesz go na wysokości prostokąta. Używamy więc najbliższego zera CGFloat (przynajmniej to „zadziałało” dla mnie ... po prostu nie idealne rozwiązanie).
Alejandro Iván
1
@ AlejandroIván twój komentarz właśnie zrobił moją noc. Mam tableView z pogrupowanymi prototypami. Używam numberSections = data.count i ustawiam numberRows = 1. Ustawiłem heightForFooterInSection, aby zrobić czyste odstępy między nimi iz jakiegoś powodu pojawił się pusty tableHeaderView.
Ryan Alexander

Odpowiedzi:

863

Pomagały mi:

YouStoryboard.storyboard> YouViewController> Inspektor atrybutów> Odznacz - Dostosuj wstawki widoku przewijania.

wprowadź opis zdjęcia tutaj

Alexander
źródło
42
Myślę, że to właściwy sposób na usunięcie tego wypełnienia, zamiast manipulowania wartościami edgeInset.
Hgeg
21
To nie działało dla mnie - mam nieprzezroczysty pasek nawigacyjny powyżej, a to wyłączone popycha zawartość pod nim.
slycrel
5
Nie działa przy użyciu niestandardowego collectionview. (Gdy widok tabeli jest w środku collectionviewcell)
Akshit Zaveri
5
Nie działało dla mnie; Jedyne, co zadziałało, to przejście na zwykły zamiast zgrupowanego
shim
28
Miałem ten problem z TableViewController wewnątrz widoku kontenera. Musiałem ustawić tę właściwość nie bezpośrednio na wbudowanym TableViewController, ale na kontrolerze widoku, który zawierał widok kontenera. Potem zadziałało.
Andy Mortimer
325

Bawiłem się trochę dłużej i wydaje się, że jest to efekt uboczny ustawiania tableView tableHeaderView = nil.

Ponieważ mój tableView pojawia się dynamicznie tableHeaderView, kiedy muszę ukryć tableHeaderView, zamiast tego robię self.tableView.tableHeaderView = nil;:

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

Podoba mi się to rozwiązanie bardziej niż ustalanie nieco arbitralnych, contentInset.topponieważ używam również contentInset.topdynamicznie. Konieczność usunięcia dodatkowych 35 pikseli za każdym razem, gdy przeliczę ponownie, contentInset.topjest żmudna.

Pan T.
źródło
4
Świetne rozwiązanie! Rzeczywiście, musisz ustawić go na 0.01f, aby pozbyć się domyślnego widoku nagłówka widoku tabeli, jak w kodzie.
Simone Manganelli,
2
BTW, można to również zrobić za pomocą jednego przeciągnięcia i upuszczenia w Konstruktorze interfejsów. W każdym razie dzięki! :)
Rudolf Adamkovič
8
Pan zasługuje na medal
Vaibhav Gautam
7
Należy pamiętać, że widok wysokości 0,01 f u góry widoku tabeli będzie oznaczać, że wszystkie komórki w linii są niewspółosiowe (pierwsza komórka ma pochodzenie Y 0,01, następna wysokość komórki + 0,01 itd.), Więc zawartość tych komórek będzie źle ustawiony. (Włącz Debug > Color Misaligned Imagesw symulatorze, aby zobaczyć to na własne oczy.) Nie chcesz tego robić.
Simon Whitaker,
2
Lepiej używać UITableViewHeaderFooterViewzamiast UIView. I CGFLOAT_MINdziała tak samo, 0.01fale lepiej w teorii.
Jaybo,
178

W przypadku IOS 7, jeśli przydzielasz widok tabeli w kontrolerze widoku, możesz zajrzeć

self.edgesForExtendedLayout = UIRectEdgeNone;

twój problem wydawał się podobny do mojego

Aktualizacja:

Swift w iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
yeahdixon
źródło
3
Pracowałem na mojej równinie UITableView. Problemy wynikają z faktu, że mój UITableViewbył w UIViewControllerśrodku, UINavigationControllerco spowodowało spadek zawartości tabeli o 44 punkty, więc początkowa zawartość nie była opóźniona navBar. To nie było potrzebne w moim układzie, więc po prostu spowodowało problemy. W końcu zmieniłem kod, automaticallyAdjustsScrollViewInsetsktóry również działał.
DBD
Ta właściwość jest stosowana tylko do wyświetlania kontrolerów osadzonych w kontenerze, takim jak UINavigationController. Kontroler widoku głównego okna nie reaguje na tę właściwość. Domyślna wartość tej właściwości to wszystko. .. Wydaje mi się, że domyślnie powinno być 0? Gdzie to ma przewagę.
Desh_
5
Bardziej elegancki dzięki Swift 3:edgesForExtendedLayout = []
Dave Batton
Witaj @yeahdixon Jakiego oprogramowania używasz do utworzenia różowej strzałki? z góry dzięki
iArezki
174

Spróbuj zmienić contentInsetwłaściwość, która UITableViewdziedziczy UIScrollView.

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

Jest to obejście, ale działa

nvrtd frst
źródło
6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);działało dla mnie najlepiej, ponieważ na górze i na dole było 20 dodatkowych pikseli.
Brian
1
Chociaż to rozwiązanie „brutalnej siły” działa, myślę, że dolne (w szczególności automatycznie dostosowujące się wstawki) powinny być wyżej w rankingu.
eladleb
134
self.automaticallyAdjustsScrollViewInsets = NO;

spróbuj, poradzisz sobie z tym!

guanhuiwit
źródło
Działa to świetnie, aby ukryć tableHeaderView w iOS 7.0, ale nie jest obsługiwane w starszych wersjach.
Brian
Działa świetnie pod iOS 7.
StackRunner
3
Ważne: Upewnij się, że robisz to w kontrolerze widoku kontenera, jeśli Twój UITableView jest umieszczony na kontrolerze, który jest następnie osadzony w innym kontrolerze, zrób to w wbudowanym górnym kontrolerze, a nie bezpośrednio w tym, w którym umieścisz UITableView (gdzie AutoLayout będzie dbać o rzeczy).
James Stone
To jest lepsze niż uncheck Adjust scroll view insets. Ponieważ czasami nie używamy scenorysu do tworzenia naszego interfejsu użytkownika.
JW.ZG
To działa dla mnie. Do paska nawigacji i widoku tabeli podłączyłem widok, nie dzieje się to w iOS 11, ale występuje w iOS 10. Dziękujemy.
dobiho
78

Możesz wykryć, czy twoja aplikacja działa na iOS7 lub nowszym i dodać te dwie metody do delegata widoku tabeli (zwykle w kodzie UIViewController)

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

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

To może nie jest eleganckie rozwiązanie, ale działa dla mnie

Wersja szybka:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
LightMan
źródło
1
To zadziałało dla mnie. UITableView dodaje miejsce na wierzchu z wielu różnych powodów. W szczególności, związany z OP, problem występuje tylko w widoku tabeli zgrupowanych stylów. To rozwiązanie rozwiązało problem.
RajV
5
Możesz użyć CGFLOAT_MIN zamiast 0,001, co daje najmniejszą bezwzględną wartość CGFloat.
eiKatte,
2
To poprawna odpowiedź, ponieważ prawdziwa cecha polega na tym, że wypełnienie występuje tylko w widoku tabeli zgrupowanego stylu i jest ignorowane, jeśli podasz nagłówek / stopkę
Jakub Truhlář
To powinno być oznaczone jako poprawna odpowiedź. Metoda delegowania do zastąpienia i odpowiada na pytanie. Przynajmniej spróbuj najpierw, jeśli czytasz tak daleko w dół wszystkich hacków. Spróbuj ćwierkać: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: sekcja (NSInteger) {// return CGFLOAT_MIN; zwraca 30,0f; }
Matthew Ferguson
Miły! Jako bonus, jeśli chcesz trochę nagłówka na górze i więcej między zgrupowanymi sekcjami, możesz użyć następujących opcji:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders
55

Znalazłem przyczynę mojego oryginalnego błędu i stworzyłem przykładowy projekt, który to pokazuje. Uważam, że występuje błąd w systemie iOS7.

Począwszy od iOS7, jeśli utworzysz UITableView ze stylem zgrupowanym, ale nie masz delegata ustawionego na pierwszym układzie, a następnie ustawisz delegata i zadzwonisz reloadData, u góry będzie 35px miejsca, które nigdy nie znikną.

Zobacz projekt, który wykonałem, pokazując błąd: https://github.com/esilverberg/TableViewDelayedDelegateBug

W szczególności ten plik: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

Jeśli linia 24 jest aktywna,

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

u góry będzie dodatkowe 35 pikseli miejsca. Jeśli linia 27 jest aktywna, a linia 24 jest zakomentowana,

self.tableView.delegate = self;

brak miejsca na górze. To tak, jakby tableView gdzieś buforował wynik i nie przerysował się po ustawieniu delegata i wywołaniu reloadData.

esilver
źródło
21
Dodam, że nawet jeśli jest delegat, ale delegat tableView:heightForHeaderInSection:i tableView:heightForFooterInSection:zwraca 0, również będziesz mieć ten problem. Wdrożenie powyższych metod protokołu ORAZ zwrócenie 0.01f naprawiło to dla mnie.
John Estropia,
1
TAK!! Wypróbowałem 3 tak zwane rozwiązania i to było to! Genialne, dzięki: D
Henrik Erlandsson
doskonały. Każdy zgłosił błąd, ponieważ myślę, że nie jest to zamierzone zachowanie.
Pushparaj,
świetne znalezisko! Nadal dzieje się to w systemie iOS 9 (nie używamy XIB), ale ustawienie delegata na init naprawiło odstępy (nie w loadView ani viewDIdLoad). Dziękuję Ci!
John Stricker,
1
Ustawienie oszacowaneWysokość nagłówka pomogło mi
Viktor,
49

Odznacz „Dostosuj przewijanie Wyświetl wstawki”

wprowadź opis zdjęcia tutaj

Tú Đt
źródło
Potrzebowałem tej opcji dla innego mojego kontrolera widoku i najwyraźniej kiedy stworzyłem nowy VC, zmiana została przeniesiona. Dzięki za to!
David
Tak! Działa, wystarczy ustawić go w ContainerView i działa!
Felipe FMMobile
46

Kolejny szybki komentarz ... nawet w XCode 6.1 występuje błąd z pionowymi spacjami pojawiającymi się na górze UIScrollViews, UITextViewsi UITableViews.

wprowadź opis zdjęcia tutaj

Czasami jedynym sposobem na rozwiązanie tego problemu jest przejście do Storyboard i przeciągnięcie kontroli problemu, aby nie był to już pierwszy widok podrzędny na stronie.

wprowadź opis zdjęcia tutaj

(Dziękuję Odedowi za skierowanie mnie w tym kierunku ... Publikuję ten komentarz, aby dodać kilka zrzutów ekranu, aby zademonstrować objawy i naprawić.)

Mike Gledhill
źródło
1
Zauważ, że ten błąd, błąd, problem występuje również w iOS 8, jeśli masz UITextView jako pierwszą kontrolę podrzędną na swojej stronie ... więc nie jest to tylko problem UITableView.
Mike Gledhill
1
Ze wszystkich rozwiązań tylko ten hack działał dla mnie. Dziwne rozwiązanie dziwnego błędu. Napotkałem ten problem z UITableview.
Mesbah
4
1 milion dziękuję! To jedyne rozwiązanie, które działało dla mnie.
user139816,
1
(Jestem zdumiony, że 18 miesięcy później, a czytelnicy nadal głosują na tę odpowiedź. Czy Apple poważnie nie naprawiło jeszcze tego problemu?!)
Mike Gledhill
1
uratował mi życie! dzięki. Czy wiesz, ile czasu zajęło znalezienie tej prostej, małej „poprawki”? grrh.
Mc.Stever
40

Zgodnie z tym przewodnikiem przejścia dla systemu iOS7 firmy Apple wstawki zawartości widoku przewijania są dostosowywane automatycznie. Domyślna wartość opcji automatycznieAdjustsScrollViewInsets jest ustawiona na TAK.

UIViewController, który ma UITableView, powinien ustawić tę właściwość na NIE.

self.automaticallyAdjustsScrollViewInsets = NO;

To załatwi sprawę.

EDYCJA 1:

Można też spróbować -

self.navigationController.navigationBar.translucent = YES;

Usuwa to również dodatkowe wypełnienie u góry.

girish_vr
źródło
Bardzo dobra odpowiedź, chyba że nie odpowiada dokładnie na pytanie. Esilver mówi o luce 35 pikseli, ale iOS7 dodaje dodatkowy nagłówek 20 pikseli: równy wysokości paska stanu.
Martin
Śmieszny problem. Dziękuję za odpowiedź.
Genki,
To jest odpowiedź na inny problem.
entonio
Dziękuję, że zadziałało dla mnie, w moim konkretnym przypadku miałem kontroler widoku tabeli osadzony w kontroler widoku, a ustawiając automatycznieAdjustsScrollViewInsets = false w kontroler widoku zniknęła górna luka
Alexey
39

Korzystając z pogrupowanego TableView, użyj tego, aby uniknąć cięcia krawędzi w widokuWillAppear

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Aqib Mumtaz
źródło
Próbowałem wszystkich innych. Ten działał! Dzięki
Michael
36

Wiele wcześniejszych odpowiedzi jest zbyt hackerskich. Zerwaliby w dowolnym momencie w przyszłości, jeśli Apple zdecyduje się naprawić to nieoczekiwane zachowanie.

Źródło problemu:

  1. a UITableViewnie lubi mieć nagłówka o wysokości 0,0. Jeśli chcesz uzyskać nagłówek o wysokości 0, możesz przejść do rozwiązania.

  2. nawet jeśli później przypiszesz nagłówkowi wysokość inną niż 0.0, a UITableViewnie chce, aby początkowo przypisywano mu nagłówek o wysokości 0,0.

Rozwiązanie:

Następnie najprostszym i najbardziej niezawodnym rozwiązaniem jest upewnienie się, że wysokość nagłówka nie jest równa 0 po przypisaniu go do widoku tabeli.

Coś takiego działałoby:

// 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;

Coś takiego doprowadziłoby do problemu w pewnym momencie (zwykle po przewinięciu):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Aurelien Porte
źródło
Wreszcie znalazłem odpowiedź, która działa. Dzięki. Poza tym dowiedziałem się, że tableView.tableHeaderViewto właściwie widok akcesoriów powyżej zawartości wiersza. Przez cały czas byłem mylony z nagłówkami sekcji, dopóki nie pojawiła się twoja odpowiedź.
Joe Huang,
1
CGFLOAT_MINzostał zastąpiony przez CGFloat.leastNormalMagnitudew Swift 3
Clay Ellis
29

Storyboard:

Po prostu odznacz: Adjust Scroll View Insetsw opcjach Wyświetl kontrolera

wprowadź opis zdjęcia tutaj

Kod:

self.automaticallyAdjustsScrollViewInsets = false
Bartłomiej Semańczyk
źródło
2
using xcode 7 Nie widzę Inspektora atrybutów> Układ, gdzie powinienem dodać self.automaticallyAdjustsScrollViewInsets = false
alex
w widoku załadowano.
CW0007007,
23

Oto rozwiązanie dla iOS 10 używającego Swift 3:

Możesz pozbyć się górnych i dolnych wypełnień, wdrażając następujące metody z UITableViewDelegate.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}
AndreasLukas
źródło
Druga strona na SO pomogła mi .... Nie wiem dlaczego, może z powodu AutomaticDimension, może z powodu ograniczeń z VFL, w każdym razie dziękuję! ozi bua ist brav! : D
Pentarex
Są to nagłówki i stopki sekcji . Pytanie dotyczy całego nagłówka tabeli. Ponadto nie ma nic specyficznego dla Swift3 lub iOS 10 w żadnej z metod delegowania (istnieją od zawsze).
Nicolas Miari,
14

W moim przypadku to mi pomogło. Wspieram również iOS6.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}
Lukas
źródło
Nie jestem pewien, co to działa, ale działało idealnie. Czy możesz podać jakieś wyjaśnienie?
Matt Wolfe,
@MattWolfe Zgubiłem się i znalazłem to rozwiązanie, nie jestem pewien, dlaczego tak się dzieje. Domyślam się, że kontroler decyduje, że widok tabeli wymaga wstawki, z powodu paska stanu (lub w innych przypadkach paska narzędzi / paska), więc automatycznie go dodaje. Naprawdę mam problemy z niektórymi z nowych „funkcji” iOS7. Może ktoś to rozumie i ma na to prawdziwe wytłumaczenie?
Lukas
Ostatnie 2 dni spędziłem na przenoszeniu stosunkowo małej aplikacji na iOS 7 i wciąż mam drobne problemy .. Naprawiam to w iOS 7, to łamie się na 6 i odwrotnie ... Doprowadza mnie do szału!
Matt Wolfe
Jest to inny problem niż OP. Mimo to, w widoku zgrupowanych tabel, na górze jest dodawana dodatkowa przestrzeń.
RajV
1
wydaje się to być kluczową linią: self.automaticallyAdjustsScrollViewInsets = NO; właśnie ustawienie, które usunęło dodatkową przestrzeń, którą miałem.
Mike M
14

Po prostu dodaj do viewDidLoad w VC:

self.automaticallyAdjustsScrollViewInsets = NO;
judepereira
źródło
Ta poprawka zadziałała i wolę, aby ręcznie ustawiać wypustki za pomocą magicznych liczb. Dzięki!
imobilizer
14

Próbowałem tutaj wszystkich metod i tym razem żadna z nich nie pomogła. Mój przypadek był pogrupowane widok tabeli na iOS 9. I naprawdę nie wiem, dlaczego i jak się dowiedziałem to jedno, ale dla mnie, ustawienie tableViewHeaderz UIViewco najmniej 0.01wysokości wypracowane. CGRectZeronic nie pomogło, nic tak naprawdę nie pomogło:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
sunshinejr
źródło
10

Swift: iOS miałem widok tabeli w widoku przewijania… kiedy kliknąłem „Wstecz” na tym samym ekranie. Przewiń widok, zajmij więcej miejsca na górze .. aby rozwiązać ten problem:

 self.automaticallyAdjustsScrollViewInsets = false

Wartość logiczna wskazująca, czy kontroler widoku powinien automatycznie dostosowywać swoje wstawki widoku przewijania. Wartość domyślna to true, co pozwala kontrolerowi widoku dopasowywać wstawki widoku przewijania w odpowiedzi na obszary ekranu zajmowane przez pasek stanu, pasek nawigacji oraz pasek narzędzi lub pasek kart. Ustaw na false, jeśli chcesz samodzielnie zarządzać dopasowaniami wstawiania widoku przewijania, na przykład gdy w hierarchii widoków jest więcej niż jeden widok przewijania.

Vinod Joshi
źródło
10

Dzięki odpowiedzi @Aurelien Porte. Oto moje rozwiązanie

Przyczyna tego problemu: -

  1. UITableView nie lubi mieć nagłówka o wysokości 0,0. Jeśli chcesz uzyskać nagłówek o wysokości 0, możesz przejść do rozwiązania.
  2. nawet jeśli później przypiszesz nagłówkowi wartość inną niż 0,0, UITableView nie lubi na początku przypisywać nagłówka o wysokości 0,0.

W ViewDidLoad: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

Nie ma potrzeby czegoś takiego: -

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

W heightForHeaderInSectiondelegacie: -

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

W viewForHeaderInSectiondelegacie: -

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 
}
Ashish Pisey
źródło
10

W ten sposób można to łatwo naprawić w iOS 11 i Xcode 9.1 za pomocą Storyboard:

Wybierz Widok tabeli> Inspektor rozmiarów> Wstawki zawartości: Nigdy

Saeed Ir
źródło
1
Pracował dla mnie :)
bhupinder
Świetny! Dzięki :)
Saeed Ir
1
To jest zamiast automaticallyAdjustsScrollViewInsetsw iOS 11
Nik Kov
9

Zakładam, że to tylko część nowej UITableViewStyleGroupedstylizacji. Jest we wszystkich widokach tabeli zgrupowanych i wydaje się, że nie ma bezpośredniego sposobu kontrolowania tej przestrzeni.

Jeśli to miejsce jest reprezentowany przez UIView, byłoby możliwe, aby przeszukać wszystkie subviewszUITableView znaleźć ten pogląd specyficzny i edytować go bezpośrednio. Istnieje jednak możliwość, że przestrzeń ta jest tylko zakodowanym na stałe przesunięciem przed uruchomieniem nagłówków i komórek i nie będzie możliwości edycji.

Aby przeszukać wszystkie widoki podrzędne (uruchomiłbym ten kod, gdy tabela nie ma komórek, aby ułatwić odczyt danych wyjściowych):

- (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];
    }
}
Kevin
źródło
3
Jeśli UITableViews (a ściślej UITableViewCellScrollView) na iOS7 nauczył nas jednej rzeczy, pozostawić samą hierarchię widoków wbudowanych klas.
Matthias Bauch,
Słuszna uwaga. Inną opcją jest ... ciągłe hakowanie dla każdego iOS;)
Dan Rosenstark
Ups, tak. Chciałem napisać to ostrzeżenie, ale zapomniałem.
Kevin,
Kevin - myślę, że masz rację, to z założenia. Wygląda na to, że zwracanie 0 dla heightForHeaderInSection jest najprostszym sposobem na usunięcie tego wypełnienia. Z jakiegoś powodu w tym konkretnym przypadku nie działało to dla mnie, ale działa na innych UITableViews.
esilver,
1
To zdecydowanie „z założenia”. Jeśli wstrzymałeś wykonywanie i uruchomiłeś: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]zobaczysz, że nagłówek tabeli, nagłówek pierwszej sekcji lub pierwsza komórka (w zależności od tego, czego używasz) naturalnie pozostawia granicę 35px .... boo.
Pan T
9

Moja odpowiedź będzie bardziej ogólna, ale również w tym przypadku można ją zastosować.

Jeśli widok główny ( ViewController ) lub pierwszy element podrzędny (widok podrzędny) widoku głównego jest podklasą UIScrollView (lub samego UIScrollView) i jeśli

self.navigationController.navigationBar.translucent = YES;

framework automatycznie ustawi wstępnie obliczoną zawartośćInset .


Aby tego uniknąć, możesz to zrobić

self.automaticallyAdjustsScrollViewInsets = NO;

ale w moim przypadku nie byłem w stanie tego zrobić, ponieważ implementowałem SDK, który ma komponent UIView, z którego mogą korzystać inni programiści. Ten składnik UIView zawiera UIWebView (który ma UIScrollView jako pierwszy widok podrzędny). Jeśli ten komponent zostanie dodany jako pierwszy element podrzędny w hierarchii widoków UIViewController, automatyczne wstawki zostaną zastosowane przez system.

Naprawiłem to, dodając widok sztuczny z ramką (0,0,0,0) przed dodaniem UIWebView.

W tym przypadku system nie znalazł podklasy UIScrollView jako pierwszego pod-widoku i nie zastosował wstawek

zvjerka24
źródło
ratownik! dziękujęself.automaticallyAdjustsScrollViewInsets = false
ethanneff
8

Ten kod działał dla mnie. Najlepsza odpowiedź dla mnie została napisana objective-Cz góry, więc przekonwertowałem go na Swift.

Dla Swift 4.0+

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

Po prostu napisz to, viewDidLoad()a zadziała jak urok.

Vipul Kumar
źródło
1
dziękuję bardzo, działało dobrze dla mnie.
Ângelo Polotto
1
witamy szczęśliwego kodowania
Vipul Kumar
7

Miałem taką samą poprawkę jak Arielyz. Po przeniesieniu UITableView, aby nie był pierwszym widokiem podrzędnym widoku nadrzędnego, zniknął. Moja przestrzeń miała 20 pikseli, a nie 35.

Nie byłem w stanie odtworzyć go w xib pionowym, tylko xib poziomym. Zgłoszę błąd radaru później, jeśli będę mógł go odtworzyć w prostej aplikacji demonstracyjnej.

Oded
źródło
Wystąpił ten sam problem, nie był w stanie go rozwiązać, zmieniając contentInset, ale ta metoda zadziałała, mimo że jest dość hackerska. Za pomocą tego wizualnego narzędzia do debugowania zobaczyłem, że chociaż UITableView ma odpowiednią wysokość, to UITableViewWrapper w nim nie ma.
Mic Fok,
Doskonały. To naprawiło błąd dla mnie w XCode 6.1. Żadna inna sugestia na tej stronie StackOverflow nie miała znaczenia. Miałem UITableView w ramach UIView i to był pierwszy widok podrzędny. Przeciągnięcie go, aby stać się drugim pod-widokiem, naprawiło go idealnie. (Jeśli ktoś mnie potrzebuje, będę w pubie.)
Mike Gledhill
Dziękuję Ci! Działa to również, jeśli w kontenerze znajduje się kontroler widoku tabeli. Przesunięcie kontenera w taki sposób, aby nie był pierwszy w widoku rodzica, usuwa lukę u góry widoku tabeli.
strangeluck,
7

Myślę, że tworzenie UIEdgeInsets -35 0 0 0 jest żmudne. W moim przypadku zaimplementowałem metodę tableView: heightForHeaderInSection: i może ona zwrócić 0.

Kiedy zmieniłem 0 na 0.1f, problem po prostu zniknął.

Jiangfan Du
źródło
1
Gdybym mógł, głosowałbym to więcej niż raz. Musi to być dziwny błąd autoukładu czy coś ... Ponieważ cokolwiek> 0 działa, sugeruję zamiast 0.1 użyć FLT_EPSILON lub DBL_EPSILON, ponieważ oba reprezentują najmniejszą dodatnią wartość, taką jak 1,0 + epsilon! = 1,0
Henri Normak
7

Jedyne, co działało dla mnie, to:

Szybki :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Cel C :

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

Ponadto nadal miałem dodatkowe miejsce na pierwszą część. Stało się tak, ponieważ tableHeaderViewniewłaściwie korzystałem z tej właściwości. Naprawiono to również poprzez dodanie:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
Danut Pralea
źródło
Działa dla mnie dla Swift 4.2. Dzięki
Sylar,
Próbowałem wszystkiego na tej stronie, zgrupowany widok tabeli z iOS13 z widokiem nagłówka. self.tableView.tableHeaderView = UIView (ramka: CGRect (x: 0, y: 0, szerokość: tableView.frame.size.width, wysokość: 0,01)). naprawiono problem.
Ning
7

Kod Swift 4: Do widoku tabeli bez nagłówków sekcji możesz dodać ten kod:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

i uzyskasz odstęp między nagłówkami do 0.

Jeśli chcesz nagłówek o określonej wysokości, podaj tę wartość:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

oraz widok z widoku delegata viewForHeaderinSection.

keerthana manoharan
źródło
To nie odpowiada na pytanie. Pytanie dotyczyło tego, skąd pochodzi dodatkowe odstępy, a nie jak się go pozbyć.
Stephen Newell
dziwne jest to, że jeśli zwrócisz 0 w heightForHeaderInsection, nadal dostaniesz tę dodatkową przestrzeń. Działa idealnie z CGFloat.leastNormalMagnitude (najmniej dodatnia liczba)
ShadeToD
7

Aby być konkretnym, aby usunąć miejsce tableviewHeader z góry wprowadziłem następujące zmiany:

YouStoryboard.storyboard> YouViewController> Wybierz TableView> Inspektor rozmiaru> Wstawki treści - Ustaw na Nigdy.

wprowadź opis zdjęcia tutaj

użytkownik832
źródło
Jakie są dodatkowe informacje oprócz zrzutu ekranu w porównaniu do tej odpowiedzi ?
Artjom B.
tak samo, jak sądzę, nie znalazłem tej odpowiedzi, kiedy szukałem rozwiązania. Czy powinienem usunąć swoją odpowiedź ...?
user832
Nie, jeśli możesz nieco rozszerzyć swoją odpowiedź, opisując, dlaczego wstawki treści = Nigdy tak naprawdę nie rozwiązuje tego problemu (jak działa ta opcja?).
Artjom B.
Gdy wstawianie zawartości jest ustawione na nigdy, tableView nie będzie przewijał w górę podczas edycji pola tekstowego.
mojtaba al moussawi
6

użyj tego, myślę, że ta pomoc ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
Shahzaib Maqbool
źródło
1
Znakomity! Działa jak urok w iOS 9.2. Ta odpowiedź jest idealna, ponieważ w niektórych przypadkach muszę ukryć pierwszy nagłówek, podczas gdy w innych go pokazać. Widziałem inną odpowiedź za pomocą CGFloat.min, która również działa. Więc mój viewController może teraz podawać albo liczbę rzeczywistą, jak 44,0 lub w zasadzie 0.
David H
6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
AG
źródło
automatycznieAdjustsScrollViewInsets = fałszywa praca ode mnie! Dzięki!
Daniel Kuta,