Я много читал о переходе пользовательского интерфейса iOS7.
Я не могу получить то , что эти три свойства automaticallyAdjustsScrollViewInsets
, extendedLayoutIncludesOpaqueBars
, edgesForExtendedLayout
??
Например, я пытаюсь заставить мои контроллеры представления запускаться ниже строки состояния, но я не в состоянии достигнуть этого.
ios
objective-c
xcode
uiviewcontroller
ios7
user1010819
источник
источник
Ответы:
Начиная с iOS7, контроллеры представления по умолчанию используют полноэкранный макет. В то же время у вас есть больший контроль над тем, как он размещает свои представления, и это делается с этими свойствами:
edgesForExtendedLayout
По сути, с помощью этого свойства вы устанавливаете, какие стороны вашего вида могут быть расширены, чтобы охватить весь экран. Представь, что ты толкаешь
UIViewController
в себяUINavigationController
. Когда представление этого контроллера представления выложено, оно начнется там, где заканчивается навигационная панель, но это свойство будет определять, какие стороны вида (верхняя, левая, нижняя, правая) могут быть расширены для заполнения всего экрана.Давайте посмотрим на это на примере:
Здесь вы не устанавливаете значение
edgesForExtendedLayout
, поэтому берется значение по умолчанию (UIRectEdgeAll
), поэтому представление расширяет свой макет, чтобы заполнить весь экран.Это результат:
Как видите, красный фон простирается за панелью навигации и строкой состояния.
Теперь вы собираетесь установить это значение
UIRectEdgeNone
, поэтому вы говорите контроллеру вида не расширять вид, чтобы покрыть экран:И результат:
automaticallyAdjustsScrollViewInsets
Это свойство используется, когда ваше представление является
UIScrollView
или похожим, напримерUITableView
. Вы хотите, чтобы ваша таблица начиналась там, где заканчивается панель навигации, потому что вы не увидите весь контент, если нет, но в то же время вы хотите, чтобы ваша таблица покрывала весь экран при прокрутке. В этом случае установкаedgesForExtendedLayout
None не будет работать, потому что ваша таблица начнет прокручиваться в том месте, где заканчивается панель навигации, и не будет идти за ней.Вот где это свойство пригодится, если вы позволите контроллеру представления автоматически корректировать вставки (устанавливая это свойство в YES, также значение по умолчанию), он добавит вставки в верхнюю часть таблицы, поэтому таблица начнется там, где происходит навигация. полоса заканчивается, но прокрутка покроет весь экран.
Это когда НЕТ:
И ДА (по умолчанию):
В обоих случаях таблица прокручивается за панелью навигации, но во втором случае (ДА) она запускается из-под панели навигации.
extendedLayoutIncludesOpaqueBars
Это значение является просто дополнением к предыдущим. По умолчанию для этого параметра установлено значение NO. Если строка состояния непрозрачна, представления не будут расширены для включения строки состояния, даже если вы расширили представление, чтобы покрыть его (
edgesForExtendedLayout
доUIRectEdgeAll
).Если вы установите значение YES, это позволит представлению снова перейти под строку состояния.
Если что-то не понятно, напишите комментарий и я на него отвечу.
Как iOS узнает, что использовать UIScrollView?
iOS получает первое подпредставление в представлении ViewController, которое имеет индекс 0, и, если оно является подклассом,
UIScrollView
применяет к нему объясненные свойства.Конечно, это означает, что
UITableViewController
работает по умолчанию (так какUITableView
это первый вид).источник
Не уверен, используете ли вы раскадровки, но если это так, чтобы ваши контроллеры представления запускались под строкой состояния (и над нижней панелью):
Выберите контроллер представления в IB. В инспекторе атрибутов отмените выбор «Расширить края - под верхними панелями» и «Расширить края - под нижними панелями».
источник
Я использую раскадровки и сработал вышеупомянутый совет, однако я точно не знал, как его реализовать. Ниже приведен краткий пример того, как он решил проблему, поместив рекомендованное решение в ViewController.
Моя проблема: автоматическая настройка по умолчанию имеет значение true, что вызывает разницу между дизайном раскадровки и симулятором
Решено: приведенный выше код отключен, автоматическая настройка.
источник
Я решил эту проблему, добавив эту строку, но моя проблема была связана с
UIView
, неUIScrollView
источник
Просто помните, что
automaticallyAdjustsScrollViewInsets
свойство работает, только если какое-либо представление прокрутки (представление таблицы, представление коллекции, ...)Другие предположили, что это работает, даже если это первое подпредставление, но в иерархии представлений есть другие представления прокрутки.
РЕДАКТИРОВАТЬ (расширение DIY)
Если вам нужно подобное поведение, даже если вы не можете выполнить эти условия (например, у вас есть фоновое изображение под видом прокрутки), вы можете вручную настроить вкладки вида прокрутки. Но, пожалуйста, не устанавливайте его постоянным, как 44 или 64 или даже 20, как многие предлагают вокруг SO. Вы не можете знать размер когда-либо. Там может быть incall / GPS / аудио-уведомление, панель навигации не всегда должна быть 44 пункта и т. Д.
Я думаю, что лучшее решение - это использовать layoutGuide
length
в didLayoutSubviews:Вы можете использовать bottomLayoutGuide таким же образом.
источник