Pierwszy ekran mojej aplikacji jest UITableViewController
bez paska nawigacyjnego, co oznacza, że zawartość przepływa pod paskiem stanu, więc występuje wiele kolizji tekstu. Mam regulować zarówno właściwości Under top bars
i Adjust scroll view insets
który faktycznie zatrzymać przewijanie mocy, ale kosztem utrzymania w górnej części tabeli w widoku. Próbowałem ustawić UITableView
przesunięcie ramki o 20 pikseli, ale nie wydaje się to działać, a ponieważ obecnie potrzebuję aplikacji do zgodności z iOS 6, nie mogę przejść do Storyboardów iOS 7, aby wymusić użycie autolayout górna prowadnica wysokości. Czy ktoś znalazł rozwiązanie, które działa dla obu wersji?
Rzeczy, których próbowałem: ustawienie edgesForExtendedLayout
, zmiana ustawień w Storyboard dla Under top bars
i Adjust scroll view
, zmuszanie ramki do nowego obszaru.
Obraz jest wart tysiąca słów:
źródło
UITableView
nagłówek, również płynie pod paskiem stanu.Odpowiedzi:
Dla każdego, kto chce to powielić, wykonaj następujące kroki:
UIViewController
UITableViewController
z biblioteki obiektówJeśli wykonasz powyższe kroki, po uruchomieniu aplikacji zobaczysz, że nic, w tym dostosowanie pól wyboru Xcode do „Rozszerz krawędzie pod słupkami {Góra, Dół, Nieprzezroczyste}”, nie powoduje zatrzymania pierwszego rzędu pod paskiem stanu, nie możesz też rozwiązać tego programowo.
Np. W powyższym scenariuszu następujące działania nie przyniosą efektu:
Ten problem może być bardzo frustrujący i uważam, że jest to błąd po stronie Apple'a, zwłaszcza, że pojawia się we własnym okablowaniu
UITableViewController
z biblioteki obiektów.Nie zgadzam się ze wszystkimi, którzy próbują rozwiązać ten problem, używając dowolnej formy „magicznych liczb”, np. „Użyj delty 20px”. Ten rodzaj ściśle powiązanego programowania zdecydowanie nie jest tym, czego chce od nas Apple.
Odkryłem dwa rozwiązania tego problemu:
Zachowanie
UITableViewController
sceny :Jeśli chcesz zachować
UITableViewController
scenorys bez ręcznego umieszczania go w innym widoku, możesz osadzićUITableViewController
wUINavigationController
(Edytor> Osadź w> Kontroler nawigacji) i odznaczyć „Pokazuje pasek nawigacji” w inspektorze . To rozwiązuje problem bez konieczności dodatkowego dostosowywania, a także zachowujeUITableViewController
scenę w scenorysie.Korzystanie z funkcji AutoLayout i osadzanie jej
UITableView
w innym widoku (uważam, że tak właśnie Apple chce, abyśmy to zrobili) :Utwórz puste pole
UIViewController
i przeciągnijUITableView
je. Następnie przeciągnij z wciśniętym klawiszem Ctrl wUITableView
kierunku paska stanu. Gdy mysz znajdzie się na dole paska stanu, zobaczysz dymek z autoukładem z napisem „Przewodnik po górnym układzie”. Zwolnij mysz i wybierz „Odstępy pionowe”. Dzięki temu system układu umieści go bezpośrednio pod paskiem stanu.Przetestowałem oba sposoby na pustej aplikacji i oba działają. Konieczne może być dodatkowe ulepszenie, aby działały w Twoim projekcie.
źródło
Jeśli robisz rzeczy programowo i używasz opcji
UITableViewController
bezUINavigationController
zakładu, najlepszym rozwiązaniem jest wykonanie następujących czynnościviewDidLoad
:Szybki 3
Wcześniej Swift
UITableViewController
Nadal będą przewijać za pasku stanu, ale nie będzie się pod nim, gdy przewijane w górę.źródło
topLayoutGuide
zamiast tego użyj długości.UIApplication.sharedApplication.statusBarFrame.size.height
zamiast 20.Uwaga: działało to dla mnie dla następującej konfiguracji:
Jeśli powyższe dwa warunki nie zostaną spełnione, przebieg może się różnić.
Oryginalny post
Stworzyłem mój widok programowo, co skończyło się dla mnie:
Źródło (w sekcji topLayoutGuide na dole str.39).
źródło
Dodanie do najwyższej odpowiedzi:
po tym, jak druga metoda początkowo nie działała, zrobiłem dodatkowe majsterkowanie i znalazłem rozwiązanie.
TLDR; drugie rozwiązanie z pierwszej odpowiedzi prawie działa, ale w przypadku niektórych wersji xCode ctrl + przeciągnięcie do „Przewodnika po górnym układzie” i wybranie Odstępu pionowego nic nie robi. Jednak najpierw dostosowując rozmiar widoku tabeli, a następnie wybierając „Przewodnik od górnego odstępu do górnego układu”
Przeciągnij pusty ViewController na storyboard.
Przeciągnij obiekt UITableView do widoku. (Not UITableViewController). Umieść go w samym środku za pomocą niebieskich prowadnic układu.
Utwórz własną podklasę UIViewController i dodaj
<UITableViewDataSource, UITableViewDelegate>
protokoły. Nie zapomnij ustawić ViewController twojego scenariusza na tę klasę w Inspektorze tożsamości.Utwórz ujście dla TableView w pliku implementacji i nazwij go „tableView”
Teraz część nie przycinania na pasku stanu.
Teraz możesz ustawić widok swojego stołu tak, jak zwykle, i nie przycina on paska stanu!
źródło
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1
źródło
self.topLayoutGuide.length
zviewDidLayoutSubviews
zepsuje układ widoków podrzędnych.Wybierz UIViewController na swojej serii ujęć i odznacz opcję Wydłuż krawędzie pod górnymi pasami. Pracował dla mnie. :)
źródło
Oto jak napisać to w „Swift”. Dostosowanie do odpowiedzi @ lipki:
źródło
- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
W przypadku Xcode 7 odznaczenie „półprzezroczystego” znacznika wyboru paska nawigacji działało dla mnie.
źródło
To naprawi to dla UITableViewController (bez żadnych magicznych liczb). Jedyną rzeczą, której nie udało mi się naprawić, jest rozmowa telefoniczna, w którym to przypadku blat stołu jest zbyt mocno przesunięty w dół. Jeśli ktoś wie, jak to rozwiązać, daj nam znać.
źródło
Nie wiem, jak to koszerne, ale odkryłem, że ten schemat przesuwa widok ViewController w dół i zapewnia pasek stanu z solidnym tłem:
Oczywiście zamień na
redColor
dowolny kolor tła.Musisz osobno wykonać jeden ze swizzli, aby ustawić kolor znaków / symboli na pasku stanu. Używam
View controller-based status bar appearance = NO
iwStatus bar style = Opaque black style
plist, aby zrobić to globalnie.Wydaje się, że działa i chciałbym usłyszeć o wszelkich błędach lub problemach z tym związanych.
źródło
Odpowiedź chappjc działa świetnie podczas pracy z XIB.
Znalazłem najczystsze rozwiązanie, gdy programowo tworzę TableViewControllers, owijając instancję UITableViewController w inny UIViewController i odpowiednio ustawiając ograniczenia.
Oto on:
Pozdrawiam, Ben
źródło
Myślę, że podejście do korzystania z UITableViewController może nieco różnić się od tego, co robiłeś wcześniej. To zadziałało dla mnie, ale możesz nie być jego fanem. To, co zrobiłem, to kontroler widoku z widokiem kontenera, który wskazuje mój UItableViewController. W ten sposób mogę korzystać z TopLayoutGuide dostarczonego do mojej scenorysu. Po prostu dodaj ograniczenie do widoku kontenera i powinieneś zadbać o system iOS7 i iOS6.
źródło
Skończyło się na jednym dodatkowym widoku z pożądanym tłem, dodanym po TableView i umieszczonym pod paskiem stanu:
To nie jest bardzo ładne, ale jest to dość proste rozwiązanie, jeśli potrzebujesz pracy z widokami bez Xib, i zarówno IOS6, jak i IOS7
źródło
Zrobiłem to dla wyświetlania Retina / Non-Retina jako
źródło
Poniższe rozwiązanie działa wystarczająco dobrze w kodzie bez użycia stałych magicznych i odpowiada za zmianę klasy rozmiaru przez użytkownika, np. Poprzez obracanie lub równoległe aplikacje na iPadzie:
źródło
Działa dla szybkiego 3 - In viewDidLoad ();
Ten kod: 1. Pobiera wysokość paska stanu 2. Daje górnej części tabeli wstawkę zawartości równą wysokości paska stanu. 3. Nadaje wskaźnikowi przewijania tę samą wstawkę, dzięki czemu pojawia się pod paskiem stanu.
źródło
Dla takich jak ja, którzy woleliby nie osadzać ich
UITableViewController
wUIViewController
tym, spróbuj:Niestandardowa
UITableViewController
podklasa może dołączyć widok maski do podglądu tableView. Dodaj maskę w viewDidAppear i usuń maskę w viewWillDisappear.źródło
Miałem UISearchBar na górze mojego UITableView i następujące działały;
Udostępnij i ciesz się ...
źródło
Mam to działa, ustawiając rozmiar na dowolny kształt
źródło
Rozwiązanie Abrahamchez https://developer.apple.com/library/ios/qa/qa1797/_index.html działało dla mnie w następujący sposób. Jako swój początkowy widok miałem jednego kontrolera UITableview. Próbowałem kodu przesunięcia i osadzenia w navcon, ale żadne z nich nie rozwiązało przezroczystości paska stanu.
Dodaj kontroler widoku i ustaw go jako widok początkowy. Powinno to pokazać najważniejsze wskazówki dotyczące górnego i dolnego układu.
Przeciągnij stary widok tabeli do widoku w nowym kontrolerze.
Wykonaj wszystkie czynności, aby zmodernizować tabelę do nowego kontrolera:
Zmień stary plik kontrolera widoku na dziedziczenie / podklasę z UIViewController zamiast UITableViewController.
Dodaj UITableViewDataSource i UITableViewDelegate do .h kontrolera widoku.
Podłącz ponownie wszystko, co potrzebne w scenorysie, takie jak pasek wyszukiwania.
Najważniejsze jest, aby skonfigurować ograniczenia, jak w Apple Q&A. Nie zawracałem sobie głowy wstawieniem paska narzędzi. Nie jestem pewien dokładnej sekwencji. Ale czerwona ikona pojawiła się w przewodnikach po układach, być może kiedy budowałem. Kliknąłem go i pozwoliłem Xcode zainstalować / wyczyścić ograniczenia.
Potem klikałem wszędzie, aż znalazłem ograniczenie Przestrzeń pionowa i zmieniłem jego najwyższą wartość z -20 na 0 i działało idealnie.
źródło
Używam UISplitViewController z kontrolerem nawigacyjnym i kontrolerem widoku tabeli. Działa to dla mnie w widoku głównym po wypróbowaniu wielu rozwiązań tutaj:
Jest podobny do rozwiązania Hot Licks, ale stosuje widok podrzędny do navigationController.
źródło
źródło
Oto Swift 2.3. (Xcode 8.0) rozwiązanie. Utworzyłem podklasę UITableView.
Wstawka zawartości powinna zawsze być zerowa (domyślnie). Ustawiam go ręcznie na zero. Możesz również dodać metodę czeku, która sprawia, że czek i jeśli jest to coś innego niż chcesz, to po prostu otrzymaj poprawną odpowiedź. Zmiana zostanie odzwierciedlona tylko po narysowaniu widoku tabeli (co nie zdarza się często).
Nie zapomnij zaktualizować TableView w swoim IB (w TableViewController lub po prostu TableView w twoim ViewController).
źródło
Napotkałem ten problem w systemie iOS 11, ale układ był poprawny dla systemu iOS 8 - 10.3.3. W moim przypadku ustawiłem ograniczenie przestrzeni pionowej na Superview.Top Margin zamiast Superview.Top, który działa na iOS 8-11.
źródło
Znalazłem najłatwiejszy sposób, aby to zrobić, zwłaszcza jeśli dodajesz widok tabeli wewnątrz paska kart, to najpierw dodaj widok, a następnie dodaj widok tabeli w tym widoku . Daje to najlepsze przewodniki po marginesach, których szukasz.
źródło
zobacz wszystkie rozwiązania: mój projekt to po prostu xib, więc rozwiązanie z storyboardem nie działało dla mnie. self.edgesForExtendedLayout = UIRectEdgeNone; działa tylko dla kontrolera, jeśli widoczny jest pasek nawigacyjny. ale jeśli twój widok ma tylko pasek stanu, to nie zadziała. więc łączę dwa warunki.
pomóż to działa.
źródło
Jeśli potrzebujesz również obsługiwać iOS 6, musisz go warunkowo przenieść w dół. Oznacza to, że w iOS 7 powinieneś po prostu przesunąć go o 20 punktów w dół (albo poprzez
frame
manipulację lub za pomocą automatycznego układu), a w iOS 6 pozostawiasz go w spokoju. Nie wierzę, że możesz to zrobić w IB, więc musisz to zrobić w kodzie.EDYTOWAĆ
Możesz to zrobić w IB, używając delt iOS6 / iOS7. Ustaw swoją pozycję w iOS 7, a następnie w iOS 6 ustaw różnicę Y na -20 punktów. Zobacz to SO pytanie, aby uzyskać więcej informacji.
źródło
self.view.frame
iself.tableView.frame
, w obuviewWillAppear
iviewDidLoad
. Dla bezpieczeństwa ustawiłem teżsetContentNeedsDisplay
wymuszanie przerysowania.