Объясняя разницу между automaticallyAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars, edgesForExtendedLayout в iOS7



Я много читал о переходе пользовательского интерфейса iOS7.



Я не могу получить то, что эти три свойства automaticallyAdjustsScrollViewInsets,extendedLayoutIncludesOpaqueBars,edgesForExtendedLayout??



например, я пытаюсь заставить мои контроллеры вида запускаться ниже строки состояния, но я не могу этого достичь.

710   5  

5 ответов:

начиная с iOS7, контроллеры вида по умолчанию используют полноэкранный макет. В то же время у вас есть больше контроля над тем, как он излагает свои взгляды, и это делается с помощью этих свойств:

edgesForExtendedLayout

в основном, с помощью этого свойства вы устанавливаете, какие стороны вашего зрения могут быть расширены, чтобы покрыть весь экран. Представьте, что вы толкаете UIViewController на UINavigationController. Когда представление этого контроллера представления будет выложено, оно запустится где заканчивается панель навигации, но это свойство будет устанавливать, какие стороны вида (сверху, слева, снизу, справа) могут быть расширены, чтобы заполнить весь экран.

давайте посмотрим на это с примером:

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

здесь вы не устанавливаете значение edgesForExtendedLayout, поэтому берется значение по умолчанию (UIRectEdgeAll), поэтому вид расширяет его макет, чтобы заполнить весь экран.

вот результат:

without edges for extended layout, the view fills the whole screen

как вы можете видеть, красный фон простирается позади панели навигации и панели состояния.

теперь, вы собираетесь установить это значение в UIRectEdgeNone, поэтому вы говорите контроллеру вида не расширять вид, чтобы покрыть экран:

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
viewController.edgesForExtendedLayout = UIRectEdgeNone;
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

и в итоге:

with edgesForExtendedLayout set, the view is just under the navigation

automaticallyAdjustsScrollViewInsets

это свойство используется, когда ваш вид UIScrollView или подобный, как UITableView. Вы хотите, чтобы ваш стол начинался там, где панель навигации заканчивается, потому что вы не увидите весь контент, если нет, но в то же время вы хотите, чтобы ваш стол, чтобы покрыть весь экран при прокрутке. В таком случае, установка edgesForExtendedLayout ни один не будет работать, потому что ваша таблица начнет прокрутку, где заканчивается панель навигации, и она не будет идти за ней.

вот где это свойство пригодится, если вы позволите контроллеру вида автоматически настроить вставки (установив это свойство на Да, а также значение по умолчанию), он добавит вставляется в верхнюю часть таблицы, поэтому таблица будет начинаться там, где заканчивается панель навигации, но прокрутка будет охватывать весь экран.

это когда нет:

the table will scroll over the whole screen, but starts out partially covered

и да (по умолчанию):

the table scrolls over the whole screen, and starts just under the navigation

в обоих случаях таблица прокручивается за навигационной панелью, но во втором случае (да) она будет начинаться снизу навигации бар.

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 по умолчанию, вызывая разницу между дизайном раскадровки и симулятором Auto Adjust set to true by default causing a difference between storyboard design and simulator

решен: Код выше применяется, выключая автоматическую регулировку. Code above applied, turning off the auto-adjust.

я решил эту проблему, добавив эту строку, но моя проблема была связана с UIView, а не UIScrollView

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

    Ничего не найдено.