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ąć.

Author: KlimczakM, 2013-09-14

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:

bez krawędzi dla rozszerzonego układu, widok wypełnia cały ekran

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:

z ustawieniem edgesForExtendedLayout Widok znajduje się tuż pod nawigacją

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:

stół przewija się po całym ekranie, ale zaczyna się częściowo zakryty

I tak (domyślnie):

tabela przewija się po całym ekranie i zaczyna się tuż pod nawigacją

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).

 579
Author: Antonio MG,
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".

 15
Author: Ali Beadle,
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 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ę. Powyższy kod zastosowany, wyłączając automatyczną regulację.

 10
Author: Christopher Wade Cantley,
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;
 5
Author: user3430340,
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.

 2
Author: Vojta Rujbr,
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