Usuń puste miejsce przed komórkami w UITableView

Obecnie próbuję umieścić UITableView w innym miejscu, a nie na górze kontrolera widoku. Mając to na uwadze, próbuje dodać nagłówek w górnej części, aby uwzględnić pasek nawigacyjny, ale nie jest to potrzebne, ponieważ nie mam u góry kontrolera.

Jeśli położę lewy górny róg UITableView tam, gdzie chcę, aby komórki były, to nie umieszczę tam komórek:

Teraz, jeśli po prostu przesunąć widok tabeli w górę, tak aby komórki były w prawidłowym miejsce, mam inny problem - komórki można przenieść tam podczas przewijania (to jest moim palcem nad kontrolerem nawigacyjnym):

Kiedy Puszczę, tak - komórki pójdą tuż pod paskiem wyszukiwania, ale jest to oczywiście problem, jak można je wyżej.

Jak miałbym to zrobić? Jest jakiś łatwiejszy sposób?

Author: Julian Król, 2013-09-20

26 answers

Czy komórki UITableView wyświetlają się na pustym miejscu podczas przewijania w dół?

Jeśli tak, to problemem może być wstawka dodana do UITableView ze względu na Kontroler nawigacyjny, który masz w widoku. Wstawka jest dodawana do widoku tabeli w celu umieszczenia zawartości poniżej paska nawigacyjnego, gdy nie wystąpi przewijanie. Po przewinięciu tabeli zawartość przewija się i wyświetla pod przezroczystym paskiem nawigacyjnym. Takie zachowanie jest oczywiście pożądane tylko wtedy, gdy tabela widok rozpoczyna się bezpośrednio pod paskiem nawigacyjnym, co nie ma miejsca w tym przypadku.

Należy zauważyć, że iOS dostosowuje wstawkę zawartości tylko dla pierwszego widoku w hierarchii widoku, jeśli jest to UIScrollView lub potomek (np. UITableView i UICollectionView). Jeśli twoja hierarchia widoków zawiera wiele widoków przewijania, automaticallyAdjustsScrollViewInsets dokona korekty tylko pierwszego.

Oto jak zmienić to zachowanie:

A) Interface Builder

  • Wybierz widok controller
  • otwarty Inspektor atrybutów
  • W Inspektorze atrybutów IB (po wybraniu kontrolera widoku) jest domyślnie włączona właściwość o nazwie "Dostosuj wstawianie widoku przewijanego". Odznacz tę opcję:


    (Zdjęcie dzięki uprzejmości Dheeraj D)

Nie jestem pewien, która wersja Xcode wprowadziła tę opcję( nie zauważyłem jej w Uwagach do wydania), ale jest ona przynajmniej dostępna w wersji 5.1.1.

Edit: aby uniknąć nieporozumień, była to trzecia opcja wymieniona w komentarzach

B) Programowo

Dodaj to do tj. viewDidLoad (napisy do Slavco Petkovski 's answer and Cris R ' s comment)

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

C) może to być istotne dla old schoolers

Możesz to naprawić dodając

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

Lub jeśli używasz IB i jeśli pasek nawigacji nie jest przezroczysty (nie można powiedzieć od zrzut ekranu)

  • Wybierz kontroler widoku
  • otwarty Inspektor atrybutów
  • w opcjach kontrolera widoku Rozszerz sekcję krawędzi usuń zaznaczenie "pod górnym paskiem"
 365
Author: lekksi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 09:44:36

Miałem ten sam problem i jestem prawie pewien, że w pewnym momencie miałem tam UIView. Po prostu skopiowanie całego widoku tabeli, usunięcie go i wklejenie go ponownie naprawiło to dla mnie.

 68
Author: irblue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-11 16:14:32

Wybierz widok tableview w storyboardzie i upewnij się, że styl jest ustawiony na "zwykły", zamiast"zgrupowany". Ustawienie to można znaleźć na karcie Inspektor atrybutów.

 29
Author: netshark1000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 09:48:27

W moim przypadku miałem UILabel pod UITableView w hierarchii widoków.

Przesunąłem go "do przodu" i pojawiła się pusta spacja. Nie wiem dlaczego, ale to działa tak, jeśli coś jest pod tableView, ukrywa puste miejsce.

Możesz również spróbować sprawdzić/odznaczyć "Dostosuj Wstawki przewijania widoku" na Inspektorze kontrolera widoku na storyboardzie.

Tutaj wpisz opis obrazka

 9
Author: André Cytryn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-04 16:26:54

Żadne z powyższych nie pomogło mi. ale zrobienie to pomogło :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

Zamiast '-64' możesz umieścić dowolną inną liczbę w zależności od wysokości paska nawigacyjnego.

 5
Author: Tung Fam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-16 12:38:11

Może być dodane UIRefreshControl. Mam taki problem z takim kodem:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

Jak widzisz, ustawiam self.refreshController zaraz po init

Ale jeśli ustawisz refreshControl Po ustawieniu, Top-spacja Ci nie przeszkadza.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}
 4
Author: akaDuality,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-27 16:27:48

Nie mogę powiedzieć na pewno, ale wygląda na to, że masz dodatkowy UIView zatrzymany między miejscem, w którym zaczynają się komórki prototypowe, a szczytem UITableView. Mój obraz wygląda dokładnie tak jak Twój, jeśli usuniesz tekst / linie, które dodałem.

Tutaj wpisz opis obrazka

 3
Author: Mike S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 04:15:01

Nadal nie jestem pewien, co spowodowało tę dodatkową przestrzeń na górze, ale odkryłem, że usunięcie UITableView ze spacją i zastąpienie go nowym zabrało tę przestrzeń.

Musiałem przypadkowo przeciągnąć tam UIView, ale nie mogłem go wybrać, więc nie mogłem usunąć.

 3
Author: hetelek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-21 14:11:50

Jeśli robisz to na iOS 11, automaticallyAdjustsScrollViewInsets nie będzie działać, ponieważ jest przestarzały, następujący kod działał dla mnie jak na odpowiedź w tym poście: https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }
Mam nadzieję, że to pomoże.
 3
Author: Jacobo Koenig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-27 17:57:21

Sprawdź ramkę tableview w storyboardzie lub xib. Mine domyślnie ma wartość pozycji y, stąd błąd

 2
Author: Arthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-27 00:23:53

Cóż, dla mnie problem wystąpił, gdy przeciągnąłem prototyp komórki z menu do widoku tabeli. Więc usunąłem to i po prostu ustawiłem prototyp komórki na 1 w właściwości Inspektora widoku tabeli

 1
Author: Junaid Ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-30 05:33:28

W mojej aplikacji również doświadczyłem takiego problemu. Ustawiłem górną część krawędzi tableView zero. Wypróbowałem również set false dla automaticallyAdjustsScrollViewInsets. Ale nie zadziałało.

W końcu mam rozwiązanie. Nie wiem, czy to właściwa droga. Ale implementacja heightForHeaderInSection metody delegowania zadziałała dla mnie. Musisz zwrócić niezerową wartość, aby to wykonać (return zero wyświetli taką samą przestrzeń jak wcześniej).
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}
 1
Author: Anusha Kottiyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 22:29:46

Robię to programowo, i po prostu przesunąłem mój addSubview (tableView) na dół po dodaniu wszystkich moich innych podviewów, i to rozwiązało mój problem!

Nie wiem, dlaczego to pojawia się tylko na urządzeniu, a nie na moim symulatorze, ale tak czy inaczej jest przynajmniej proste rozwiązanie!

 1
Author: Austin Whitelaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 09:43:00

Dopóki UITableView nie jest pierwszym podglądem kontrolera widoku, puste miejsce nie pojawi się.

Rozwiązanie: Dodaj obiekt ukryty / Wyczyść widok (widoki, etykiety, przycisk itp.) jako pierwszy subview kontrolera widoku (na tym samym poziomie co UITableView, ale przed nim).

 1
Author: jr.ong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 09:50:44

UIView można wstawić u góry i u dołu tabeli(przeciągnij i upuść). Ustaw ich właściwości jako przezroczyste i wysokość 1 px. Ma to na celu usunięcie dodatkowej wyściółki przed komórkami.

 0
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-22 11:32:56

Miałem też taki problem widok tableView nie był ostatnim widokiem w hierarchii. W moim przypadku miałem widok powyżej (mimo że nie nakładały się na siebie), więc przeciągnąłem go ponad widok tabeli w hierarchii i to się stało.

 0
Author: Sebyddd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-04 12:44:26

Właśnie znalazłem na to rozwiązanie.

Wystarczy wybrać tableview i clic Editor - > Arrange - > Send to Front

U mnie zadziałało i mam nadzieję, że wam pomoże.

 0
Author: Daniel Meza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-14 19:24:22

W moim przypadku używałem ContainerViewController i umieszczałem w nim UITableViewController. Po usunięciu ContainerViewController. Problemy znikają.

 0
Author: Sandeep Ahuja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-29 05:52:48

Xcode 8 bug ...

Spróbuj najpierw, jeśli styl Storyboard UITableView jest ustawiony na zwykły.

Ustaw styl tabeli na zgrupowany, a następnie z powrotem na zwykły. To usunęło miejsce w mojej aplikacji na czele mój UITableView.

 0
Author: Carl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-07 15:32:54

W moim przypadku używałem widoku kontenera.(Main View -- > Contaner View -- > UITableView)

Dodatkowa przestrzeń na górze, myślę, jest jak przestrzeń na pasku powiadomień urządzenia(gdzie wyświetlany jest czas, bateria). Naprawdę, to nie jest założenie.

To co zrobiłem było z UI Buildera:

  • Wybierz kontroler widoku tabeli complete
  • otwarty Inspektor atrybutów
  • Go to -> View Controller - > Layout - > "Select Wants Full Screen"
 0
Author: Patricio Diego,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 09:41:26

Możesz użyć tego kodu do viewDidLoad lub viewdidappear, w którym tworzona jest twoja tabela:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];
 0
Author: Vinod Joshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 09:41:36

W 2017 roku, to, co działa dla mnie, to po prostu jedna linia

NavigationController?.pasek nawigacyjny.isTranslucent = false

Nie mam pojęcia, dlaczego to miałoby na to wpłynąć. Może ktoś to wyjaśni. Ale jestem pewien, że to jest odpowiedź, której większość ludzi by szukała.

 0
Author: Dew Time,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-16 19:22:05

I just found a solution for this. In my case, i was using TabBarViewController, A just uncheck the option 'Adjust Scroll View Insets'. Issues goes away. https://i.stack.imgur.com/vRNfV.png

 0
Author: NitinLandge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 04:49:14

W Storyboardzie Ustaw contentInsets swojego tableview na nigdy

Tutaj wpisz opis obrazka

 0
Author: Marwen Doukh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-16 09:22:24

Sprawdź

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • wspomnij funkcję delegata tableview cellForRowAtIndexPath:
  • Może obsługiwać zarówno ios 6, jak i 7.
 -1
Author: Manikandan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-11 23:05:23

Ustaw wstawki zawartości na zero:

 -1
Author: sriram neelamegam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 08:15:28