Объясняя разницу между automaticallyAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars, edgesForExtendedLayout в iOS7
Я много читал о переходе пользовательского интерфейса iOS7.
Я не могу получить то, что эти три свойства automaticallyAdjustsScrollViewInsets,extendedLayoutIncludesOpaqueBars,edgesForExtendedLayout??
например, я пытаюсь заставить мои контроллеры вида запускаться ниже строки состояния, но я не могу этого достичь.
5 ответов:
начиная с iOS7, контроллеры вида по умолчанию используют полноэкранный макет. В то же время у вас есть больше контроля над тем, как он излагает свои взгляды, и это делается с помощью этих свойств:
edgesForExtendedLayout
в основном, с помощью этого свойства вы устанавливаете, какие стороны вашего зрения могут быть расширены, чтобы покрыть весь экран. Представьте, что вы толкаете
UIViewControllerнаUINavigationController. Когда представление этого контроллера представления будет выложено, оно запустится где заканчивается панель навигации, но это свойство будет устанавливать, какие стороны вида (сверху, слева, снизу, справа) могут быть расширены, чтобы заполнить весь экран.давайте посмотрим на это с примером:
UIViewController *viewController = [[UIViewController alloc] init]; viewController.view.backgroundColor = [UIColor redColor]; UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];здесь вы не устанавливаете значение
edgesForExtendedLayout, поэтому берется значение по умолчанию (UIRectEdgeAll), поэтому вид расширяет его макет, чтобы заполнить весь экран.вот результат:
как вы можете видеть, красный фон простирается позади панели навигации и панели состояния.
теперь, вы собираетесь установить это значение в
UIRectEdgeNone, поэтому вы говорите контроллеру вида не расширять вид, чтобы покрыть экран:UIViewController *viewController = [[UIViewController alloc] init]; viewController.view.backgroundColor = [UIColor redColor]; viewController.edgesForExtendedLayout = UIRectEdgeNone; UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];и в итоге:
automaticallyAdjustsScrollViewInsets
это свойство используется, когда ваш вид
UIScrollViewили подобный, какUITableView. Вы хотите, чтобы ваш стол начинался там, где панель навигации заканчивается, потому что вы не увидите весь контент, если нет, но в то же время вы хотите, чтобы ваш стол, чтобы покрыть весь экран при прокрутке. В таком случае, установкаedgesForExtendedLayoutни один не будет работать, потому что ваша таблица начнет прокрутку, где заканчивается панель навигации, и она не будет идти за ней.вот где это свойство пригодится, если вы позволите контроллеру вида автоматически настроить вставки (установив это свойство на Да, а также значение по умолчанию), он добавит вставляется в верхнюю часть таблицы, поэтому таблица будет начинаться там, где заканчивается панель навигации, но прокрутка будет охватывать весь экран.
это когда нет:
и да (по умолчанию):
в обоих случаях таблица прокручивается за навигационной панелью, но во втором случае (да) она будет начинаться снизу навигации бар.
extendedLayoutIncludesOpaqueBars
это значение является просто дополнением к предыдущим. По умолчанию этот параметр имеет значение нет. Если строка состояния непрозрачна, представления не будут расширены для включения строки состояния, даже если вы расширите свое представление, чтобы покрыть его (
edgesForExtendedLayoutдоUIRectEdgeAll).если вы установите значение "Да", это позволит просматривать снова под статус бар.
если что-то не понятно, напишите комментарий, и я отвечу на него.
как iOS знает, что UIScrollView использовать?
iOS захватывает первый подвид в представлении вашего ViewController, тот, который находится в индексе 0, и если это подкласс
UIScrollViewзатем применяет к нему объясненные свойства.конечно, это означает, что
UITableViewControllerработает по умолчанию (послеUITableViewпервый взгляд).
Не уверен, что вы используете раскадровки, но если это так, чтобы ваши контроллеры просмотра запускались ниже строки состояния (и над нижней панелью):
выберите контроллер вида В IB, В инспекторе атрибутов снимите флажок "расширить края-под верхними полосами" и "расширить края - под нижними полосами".
Я использую раскадровки и с помощью приведенного выше совета работал, однако я не был точно уверен, как это реализовать. Ниже приведен краткий пример в swift того, как он прояснил проблему, поместив рекомендуемое решение в 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. } }Моя Проблема: Автоматическая настройка установите значение true по умолчанию, вызывая разницу между дизайном раскадровки и симулятором
решен: Код выше применяется, выключая автоматическую регулировку.
я решил эту проблему, добавив эту строку, но моя проблема была связана с
UIView, а неUIScrollViewself.navigationController.navigationBar.translucent = NO;
просто голые в виду, что
automaticallyAdjustsScrollViewInsetsсвойство работает только в том случае, если какой-то вид прокрутки (вид таблицы, вид коллекции,...) есть либо
- вид VC, или
- первый подвид этого вида
другие предположили, что он работает, даже если это первый подвид, но в иерархии представлений есть и другие виды прокрутки.
редактировать (расширение DIY)
Если вы хотите подобное поведение, даже если вы не можете выполнить эти условия (например, у вас есть фоновое изображение под видом прокрутки), вы можете настроить вставки вида прокрутки вручную. Но, пожалуйста, не устанавливайте его на константу, как 44 или 64 или даже 20, как многие предлагают вокруг так. Вы не можете знать размер никогда. Там может быть один/ГПС/звуковое оповещение, панель навигации не должна быть всегда 44 ПТС и т. д.
Я думаю, что лучшим решением является использование layoutGuide
lengthв didLayoutSubviews:override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() scrollView.contentInset = UIEdgeInsets(top: topLayoutGuide.length, left: 0, bottom: 0, right: 0) scrollView.scrollIndicatorInsets = scrollView.contentInset }вы можете использовать bottomLayoutGuide внутри точно так же.






Comments