Począwszy od iOS7, u góry moich jest więcej miejsca, UITableView
które mają styl UITableViewStyleGrouped
.
Oto przykład:
Widok tabeli rozpoczyna się od pierwszej strzałki, jest 35 pikseli niewyjaśnionego dopełnienia, a następnie zielony nagłówek jest UIView
zwracany 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
ios
uitableview
ios7
esilver
źródło
źródło
UITableView
nie lubi być przypisywany nagłówkowi o wysokości 0,0. Sprawdź stackoverflow.com/a/31223403/1394534, aby uzyskać więcej informacji.self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];
Uwaga:0.0f
jest 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).Odpowiedzi:
Pomagały mi:
YouStoryboard.storyboard> YouViewController> Inspektor atrybutów> Odznacz - Dostosuj wstawki widoku przewijania.
źródło
collectionview
. (Gdy widok tabeli jest w środkucollectionviewcell
)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;
:Podoba mi się to rozwiązanie bardziej niż ustalanie nieco arbitralnych,
contentInset.top
ponieważ używam równieżcontentInset.top
dynamicznie. Konieczność usunięcia dodatkowych 35 pikseli za każdym razem, gdy przeliczę ponownie,contentInset.top
jest żmudna.źródło
Debug > Color Misaligned Images
w symulatorze, aby zobaczyć to na własne oczy.) Nie chcesz tego robić.UITableViewHeaderFooterView
zamiast UIView. ICGFLOAT_MIN
działa tak samo,0.01f
ale lepiej w teorii.W przypadku IOS 7, jeśli przydzielasz widok tabeli w kontrolerze widoku, możesz zajrzeć
twój problem wydawał się podobny do mojego
Aktualizacja:
Swift w iOS 9.x:
Swift 3:
źródło
UITableView
. Problemy wynikają z faktu, że mójUITableView
był wUIViewController
środku,UINavigationController
co spowodowało spadek zawartości tabeli o 44 punkty, więc początkowa zawartość nie była opóźnionanavBar
. To nie było potrzebne w moim układzie, więc po prostu spowodowało problemy. W końcu zmieniłem kod,automaticallyAdjustsScrollViewInsets
który również działał.edgesForExtendedLayout = []
Spróbuj zmienić
contentInset
właściwość, któraUITableView
dziedziczyUIScrollView
.Jest to obejście, ale działa
źródło
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.spróbuj, poradzisz sobie z tym!
źródło
uncheck Adjust scroll view insets
. Ponieważ czasami nie używamy scenorysu do tworzenia naszego interfejsu użytkownika.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)
To może nie jest eleganckie rozwiązanie, ale działa dla mnie
Wersja szybka:
źródło
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
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,
u góry będzie dodatkowe 35 pikseli miejsca. Jeśli linia 27 jest aktywna, a linia 24 jest zakomentowana,
brak miejsca na górze. To tak, jakby tableView gdzieś buforował wynik i nie przerysował się po ustawieniu delegata i wywołaniu reloadData.
źródło
tableView:heightForHeaderInSection:
itableView: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.Odznacz „Dostosuj przewijanie Wyświetl wstawki”
źródło
Kolejny szybki komentarz ... nawet w XCode 6.1 występuje błąd z pionowymi spacjami pojawiającymi się na górze
UIScrollViews
,UITextViews
iUITableViews
.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.
(Dziękuję Odedowi za skierowanie mnie w tym kierunku ... Publikuję ten komentarz, aby dodać kilka zrzutów ekranu, aby zademonstrować objawy i naprawić.)
źródło
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.
To załatwi sprawę.
EDYCJA 1:
Można też spróbować -
Usuwa to również dodatkowe wypełnienie u góry.
źródło
Korzystając z pogrupowanego TableView, użyj tego, aby uniknąć cięcia krawędzi w widokuWillAppear
źródło
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:
a
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.nawet jeśli później przypiszesz nagłówkowi wysokość inną niż 0.0, a
UITableView
nie 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:
Coś takiego doprowadziłoby do problemu w pewnym momencie (zwykle po przewinięciu):
źródło
tableView.tableHeaderView
to 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ź.CGFLOAT_MIN
został zastąpiony przezCGFloat.leastNormalMagnitude
w Swift 3Storyboard:
Po prostu odznacz:
Adjust Scroll View Insets
w opcjach Wyświetl kontroleraKod:
źródło
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
.źródło
W moim przypadku to mi pomogło. Wspieram również iOS6.
źródło
Po prostu dodaj do viewDidLoad w VC:
źródło
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
tableViewHeader
zUIView
co najmniej0.01
wysokości wypracowane.CGRectZero
nic nie pomogło, nic tak naprawdę nie pomogło:źródło
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:
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.
źródło
Dzięki odpowiedzi @Aurelien Porte. Oto moje rozwiązanie
Przyczyna tego problemu: -
W ViewDidLoad: -
Nie ma potrzeby czegoś takiego: -
W
heightForHeaderInSection
delegacie: -W
viewForHeaderInSection
delegacie: -źródło
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
źródło
automaticallyAdjustsScrollViewInsets
w iOS 11Zakładam, że to tylko część nowej
UITableViewStyleGrouped
stylizacji. 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ć wszystkiesubviews
zUITableView
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):
źródło
UITableViewCellScrollView
) na iOS7 nauczył nas jednej rzeczy, pozostawić samą hierarchię widoków wbudowanych klas.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.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
framework automatycznie ustawi wstępnie obliczoną zawartośćInset .
Aby tego uniknąć, możesz to zrobić
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
źródło
self.automaticallyAdjustsScrollViewInsets = false
Ten kod działał dla mnie. Najlepsza odpowiedź dla mnie została napisana
objective-C
z góry, więc przekonwertowałem go na Swift.Po prostu napisz to,
viewDidLoad()
a zadziała jak urok.źródło
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.
źródło
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ął.
źródło
Jedyne, co działało dla mnie, to:
Szybki :
Cel C :
Ponadto nadal miałem dodatkowe miejsce na pierwszą część. Stało się tak, ponieważ
tableHeaderView
niewłaściwie korzystałem z tej właściwości. Naprawiono to również poprzez dodanie:źródło
Kod Swift 4: Do widoku tabeli bez nagłówków sekcji możesz dodać ten kod:
i uzyskasz odstęp między nagłówkami do 0.
Jeśli chcesz nagłówek o określonej wysokości, podaj tę wartość:
oraz widok z widoku delegata viewForHeaderinSection.
źródło
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.
źródło
użyj tego, myślę, że ta pomoc ...
źródło
źródło