Dużo czytałem o przejściu na iOS7.
Nie jestem w stanie uzyskać co te trzy właściwości automaticallyAdjustsScrollViewInsets
, extendedLayoutIncludesOpaqueBars
, edgesForExtendedLayout
??
Na przykład próbuję zmusić moje kontrolery widoku do uruchomienia poniżej paska stanu, ale nie jestem w stanie tego osiągnąć.
ios
objective-c
xcode
uiviewcontroller
ios7
użytkownik1010819
źródło
źródło
Odpowiedzi:
Począwszy od iOS7, kontrolery widoku domyślnie używają układu pełnoekranowego. Jednocześnie masz większą kontrolę nad sposobem, w jaki określa on swoje widoki, a dzieje się to dzięki następującym właściwościom:
edgeForExtendedLayout
Zasadniczo za pomocą tej właściwości można ustawić, które strony widoku można rozszerzyć, aby obejmowały cały ekran. Wyobraź sobie, że wpychasz
UIViewController
aUINavigationController
. Po ułożeniu widoku tego kontrolera widoku rozpocznie się on tam, gdzie kończy się pasek nawigacji, ale ta właściwość określi, które strony widoku (górny, lewy, dolny, prawy) można rozszerzyć, aby wypełnić cały ekran.Zobaczmy to na przykładzie:
Tutaj nie ustawiasz wartości
edgesForExtendedLayout
, dlatego przyjmowana jest wartość domyślna (UIRectEdgeAll
), więc widok rozszerza swój układ, aby wypełnić cały ekran.Oto wynik:
Jak widać, czerwone tło wystaje za pasek nawigacyjny i pasek stanu.
Teraz ustawisz tę wartość na
UIRectEdgeNone
, więc mówisz kontrolerowi widoku, aby nie rozszerzał widoku, aby obejmował ekran:A wynik:
automatycznieAdjustsScrollViewInsets
Ta właściwość jest używana, gdy widok jest
UIScrollView
podobny lub podobny, na przykładUITableView
. Chcesz, aby Twój stół zaczynał się tam, gdzie kończy się pasek nawigacji, ponieważ nie zobaczysz całej zawartości, jeśli nie, ale jednocześnie chcesz, aby stół obejmował cały ekran podczas przewijania. W takim przypadku ustawienieedgesForExtendedLayout
Brak nie będzie działać, ponieważ tabela zacznie się przewijać w miejscu, w którym kończy się pasek nawigacji, i nie będzie się za nim znajdował.Tutaj przydatna jest ta właściwość. Jeśli pozwolisz, aby kontroler widoku automatycznie dostosowywał wstawki (ustawienie tej właściwości na TAK, również wartość domyślną), doda wstawki na górze tabeli, więc tabela rozpocznie się w miejscu nawigacji pasek się kończy, ale przewijanie obejmie cały ekran.
To jest, gdy jest ustawiony na NIE:
I TAK (domyślnie):
W obu przypadkach tabela przewija się za paskiem nawigacji, ale w drugim przypadku (TAK) rozpocznie się od paska nawigacji.
ExtendedLayoutIncludesOpaqueBars
Ta wartość jest tylko dodatkiem do poprzednich. Domyślnie ten parametr jest ustawiony na NIE. Jeśli pasek stanu jest nieprzezroczysty, widoki nie zostaną rozszerzone o pasek stanu, nawet jeśli rozszerzysz widok, aby go zakryć (
edgesForExtendedLayout
doUIRectEdgeAll
).Jeśli ustawisz wartość na TAK, pozwoli to ponownie przejść do widoku poniżej paska stanu.
Jeśli coś nie jest jasne, napisz komentarz, a ja odpowiem.
Skąd iOS wie, z którego UIScrollView korzystać?
iOS pobiera pierwszy widok podrzędny w widoku ViewController, ten o indeksie 0, a jeśli jest to podklasa,
UIScrollView
stosuje do niego wyjaśnione właściwości.Oczywiście oznacza to, że
UITableViewController
działa domyślnie (ponieważUITableView
jest to pierwszy widok).źródło
Nie jestem pewien, czy używasz scenorysów, ale jeśli tak, aby Twoje kontrolery widoku zaczynały się poniżej paska stanu (i powyżej dolnego paska):
Wybierz kontroler widoku w IB. W Inspektorze atrybutów usuń zaznaczenie opcji „Wydłuż krawędzie - pod górnymi słupkami” i „Wydłuż krawędzie - pod dolnymi słupkami”.
źródło
Używam scenariuszy i powyższe porady działały, ale nie byłem do końca pewien, jak je wdrożyć. Poniżej znajduje się krótki przykład szybkiego rozwiązania problemu poprzez wprowadzenie zalecanego rozwiązania do ViewController.
Mój problem: Automatyczna regulacja domyślnie ustawiona na true powoduje różnicę między projektem scenorysu a symulatorem
Rozwiązane: Zastosowano powyższy kod, wyłączając automatyczną regulację.
źródło
Rozwiązałem ten problem, dodając ten wiersz, ale mój problem był związany z „
UIView
nie”UIScrollView
źródło
Pamiętaj tylko, że
automaticallyAdjustsScrollViewInsets
właściwość działa tylko wtedy, gdy istnieje widok przewijania (widok tabeli, widok kolekcji ...)Inne sugerują, że nie działa, nawet jeśli jest to pierwszy widok cząstkowy, ale w hierarchii widoków istnieją inne widoki przewijania.
EDYCJA (rozszerzenie DIY)
Jeśli chcesz uzyskać podobne zachowanie, nawet jeśli nie możesz spełnić tych warunków (np. Masz obraz tła poniżej widoku przewijania), możesz ręcznie dopasować wstawki widoku przewijania. Ale proszę nie ustawiać stałej na 44 lub 64, a nawet 20, jak wielu sugeruje wokół SO. Nie możesz nigdy poznać rozmiaru. Może być powiadomienie incall / gps / audio, pasek nawigacyjny nie musi zawsze mieć 44 punktów itp.
Myślę, że najlepszym rozwiązaniem jest użycie layoutGuide
length
w didLayoutSubviews:Możesz użyć bottomLayoutGuide w ten sam sposób.
źródło