Wyjaśnianie różnic między automatycznymi korektami przeglądów, rozszerzonymlayoutincludesopaquebars, edges forextendedlayout w iOS7
Czytałem dużo o iOS7 Przejście UI.
Nie jestem w stanie zrozumieć, co te trzy właściwości automaticallyAdjustsScrollViewInsets
, extendedLayoutIncludesOpaqueBars
, edgesForExtendedLayout
??
Na przykład próbuję uruchomić Kontrolery widoku poniżej paska stanu, ale nie jestem w stanie tego osiągnąć.
5 answers
Począwszy od iOS7, Kontrolery widoku domyślnie używają układu pełnoekranowego. W tym samym czasie masz większą kontrolę nad tym, jak układa swoje widoki, a to robi się z tymi właściwościami: {]}
EdgesForExtendedLayout
Zasadniczo za pomocą tej właściwości można ustawić, które strony widoku można rozszerzyć, aby pokryć cały ekran. Wyobraź sobie, że wciskasz UIViewController
do UINavigationController
. Gdy Widok tego kontrolera widoku jest ustawiony, rozpocznie się on tam, gdzie pasek nawigacyjny kończy się, ale ta właściwość określi, które strony widoku (Góra, Lewo, Dół, prawo) mogą być rozszerzone, aby wypełnić cały ekran.
Zobaczmy to na przykładzie:
UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
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 rozciąga się za paskiem nawigacyjnym i statusem bar.
Teraz ustawisz tę wartość na UIRectEdgeNone
, więc każesz kontrolerowi widoku nie rozszerzać widoku, aby pokrył ekran:
UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
viewController.edgesForExtendedLayout = UIRectEdgeNone;
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
I wynik:
AutomaticallyAdjustsScrollViewInsets
Ta właściwość jest używana, gdy widok jest UIScrollView
lub podobny, jak UITableView
. Chcesz, aby Twoja tabela zaczynała się tam, gdzie kończy się pasek nawigacji, ponieważ nie zobaczysz całej zawartości, jeśli nie, ale jednocześnie chcesz, aby Twoja tabela pokrywająca cały ekran podczas przewijania. W takim przypadku ustawienie edgesForExtendedLayout
na None nie będzie działać, ponieważ tabela zacznie przewijać się tam, gdzie kończy się pasek nawigacyjny i nie przejdzie za nim.
Tutaj ta właściwość jest przydatna, jeśli kontroler widoku automatycznie dostosuje wstawki (ustawiając tę właściwość na YES, również wartość domyślną), doda wstawki do górnej części tabeli, więc tabela rozpocznie się tam, gdzie kończy się pasek nawigacji, ale przewijanie obejmie pasek nawigacji. cały ekran.
To jest kiedy jest ustawione na NO:
I tak (domyślnie):
W obu przypadkach tabela przewija się za paskiem nawigacyjnym, ale w drugim przypadku (tak) zacznie się od dołu paska nawigacyjnego.
ExtendedLayoutIncludesOpaqueBars
Ta wartość jest tylko dodatkiem do poprzednich. Domyślnie parametr ten jest ustawiony na NO. Jeśli pasek stanu jest nieprzezroczysty, widoki nie zostaną rozszerzone aby dołączyć pasek stanu, nawet jeśli rozszerzysz widok, aby go pokryć (edgesForExtendedLayout
do UIRectEdgeAll
).
Jeśli ustawisz wartość na YES, spowoduje to ponowne przejście widoku pod pasek stanu.
Jeśli coś nie jest jasne, napisz komentarz, a ja odpowiem.
Skąd iOS wie, jakiego UIScrollView używać?
IOS pobiera pierwszy subview w widoku kontrolera Viewcontrollera, ten o indeksie 0, a jeśli jest podklasą UIScrollView
, stosuje objaśnione właściwości za to.
Oczywiście oznacza to, że UITableViewController
działa domyślnie (ponieważ {[8] } jest pierwszym widokiem).
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-03-16 14:51:04
Nie jestem pewien, czy używasz storyboardów, ale jeśli tak, aby Kontrolery widoku zaczynały się pod paskiem stanu (i nad dolnym paskiem):
Wybierz kontroler widoku w IB, W Inspektorze atrybutów usuń zaznaczenie opcji "Extend Edges-Under Top Bars" I "Extend Edges-Under Bottom Bars".
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-07 06:32:58
Używam storyboardów i korzystanie z powyższych rad działało, jednak nie byłem dokładnie pewien, jak to wdrożyć. Poniżej znajduje się krótki przykład w języku swift, w jaki sposób rozwiązał problem, umieszczając zalecane rozwiązanie w kontrolerze ViewController.
import Foundation
import UIKit
// This ViewController is connected to a view on a storyboard that
// has a scrolling sub view.
class TheViewController: UIViewController {
// Prepares the view prior to loading. Putting it in viewDidAppear didn't work.
override func viewWillAppear(animated: Bool) {
// this method is an extension of the UIViewController
// so using self works as you might expect.
self.automaticallyAdjustsScrollViewInsets = false
// Default is "true" so this sets it to false tells it to use
// the storyboard as you have it placed
// and not how it thinks it should place it.
}
}
Mój Problem:
Automatycznie dostosuj domyślną wartość true, powodując różnicę między projektem scenorysu a symulatorem
Rozwiązany: Powyższy kod zastosowany, wyłączając automatyczną regulację.
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-11-18 16:30:47
Rozwiązałem ten problem dodając tę linię, ale mój problem był związany z UIView
, a nie UIScrollView
self.navigationController.navigationBar.translucent = NO;
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-04 12:21:23
Wystarczy pamiętać, że
automaticallyAdjustsScrollViewInsets
właściwość działa tylko wtedy, gdy jakiś widok przewijania (widok tabeli, widok kolekcji,...) jest albo
- widok VC, lub
- pierwszy podgląd tego widoku
Inne sugerowały, że działa nawet jeśli jest pierwszym podglądem, ale w hierarchii widoku są inne widoki przewijania.
EDIT (extension DIY)
Jeśli chcesz podobnego zachowania, nawet jeśli nie możesz spełnić tych warunków (np. masz obrazek w tle poniżej widok przewijania), można ręcznie dostosować wstawki widoku przewijania. Ale proszę nie ustawiać go na stałą jak 44 lub 64 lub nawet 20 jak wielu sugeruje wokół tak. Nigdy nie możesz znać rozmiaru. Może być powiadomienie incall/gps/audio, pasek nawigacji nie musi być zawsze 44 pkt itp.
Myślę, że najlepszym rozwiązaniem jest użycie layoutGuide length
w didLayoutSubviews:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentInset = UIEdgeInsets(top: topLayoutGuide.length, left: 0, bottom: 0, right: 0)
scrollView.scrollIndicatorInsets = scrollView.contentInset
}
Możesz użyć bottomLayoutGuide w ten sam sposób.
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-05-15 09:29:52