Определить, когда на экране отображаются главный и подробный контроллеры?

Я реализовал UISplitViewController использование универсального раскадровки в Xcode 6 UISplitViewController теперь поддерживается на iPhone с iOS 8, и по умолчанию на экране одновременно отображается только один контроллер представления.

Мне нужно знать, когда на экране отображаются оба контроллера - основного и подробного (iPad). Мне нужно удалить индикаторы раскрытия UITableViewCells в том случае, если они оба на экране - отображайте их только тогда, когда на экране (только iPhone) только главный контроллер представления, как приложение "Настройки".

Я мог бы просто обнаружить устройство и добавить их, только если это iPhone, но это не рекомендуется. Возможно, новое устройство будет отображать только один контроллер представления и не будет идентифицироваться как телефон. Еще одна мысль будет обнаруживать, если self.splitViewController является nil, но это не сработает, потому что не будет nil на iPhone или iPad, потому что он на самом деле находится в контроллере разделенного просмотра на iPhone.

Можно ли определить, когда главный и подробный контроллеры видны на экране одновременно?

2 ответа

Решение

UISplitViewController

@property(nonatomic, readonly, getter=isCollapsed) BOOL collapsed

Это свойство устанавливается в YES, когда содержимое контроллера разделенного представления семантически сворачивается в один контейнер. Свертывание происходит, когда контроллер представления с разделением переходит от горизонтально регулярного к горизонтально компактному окружению. После свертывания контроллер разделенного представления сообщает, что в его свойстве viewControllers имеется только один дочерний контроллер представления. Другой контроллер представления свернут в содержимое другого контроллера представления с помощью объекта делегата или временно отброшен. В свернутом виде свойство displayMode не влияет на внешний вид интерфейса контроллера разделенного представления.

Значение этого свойства равно NO, если контроллер разделенного представления способен отображать оба своих дочерних контроллера представления одновременно, даже если он не показывает их оба в данный момент. В этом расширенном режиме конфигурация контроллера разделенного представления его дочерних контроллеров представления определяется свойством displayMode. Кроме того, свойство viewControllers содержит как основной, так и дополнительный контроллеры представления.

Во время перехода от развернутого к свернутому интерфейсу значение этого свойства равно NO до тех пор, пока не завершится переход свертывания и не будут вызваны все соответствующие методы делегата. Аналогично, при переходе обратно к расширенному интерфейсу значение YES, пока переход не завершится.

из класса ссылки.

Спасибо Фредерику А. Винкельсдорфу:

Следует отметить, что.collapsed также сообщает false, если DetailViewController увеличен, чтобы охватить весь экран. Если вы действительно хотите узнать, являются ли оба видимыми, проверьте рядом с свойством.collapsed для splitViewController.displayMode == UISplitViewControllerDisplayMode.AllVisible. Я нашел это полезным при работе с iPhone 6 Plus.

Это способ проверить Displaymode для UISplitViewController

- (void)splitViewController:(UISplitViewController *)splitViewController willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode {
  if (displayMode == UISplitViewControllerDisplayModePrimaryHidden) {
       NSLog(@"Detail view is visible");
} else if (displayMode == UISplitViewControllerDisplayModeAllVisible) {
       NSLog(@"both are visible");
  }
}

Быстро:

func splitViewController(_ svc: UISplitViewController, willChangeTo displayMode: UISplitViewController.DisplayMode) {

if displayMode == .primaryHidden {
        print("Detail is visible")
    }
if displayMode == .allVisible {
        print("Master and Detail are visible")
    }
}

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

func primaryViewController(forExpanding splitViewController: UISplitViewController) -> UIViewController? {
    return nil
}

func primaryViewController(forCollapsing splitViewController: UISplitViewController) -> UIViewController? {
    return nil
}
Другие вопросы по тегам