UISplitViewController: как предотвратить расширение при повороте с компактного на обычный

Существует множество ответов на дополнительный вопрос: как предотвратить переход к PrimaryOverLay на от Regular в Compact изменение интерфейса, например, использование

func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool

В моем случае у меня есть iPhone 6+ с подробным изображением в портретной ориентации. Когда я поворачиваю устройство в горизонтальное положение (Compact в Regular), Я хочу, чтобы основной вид был скрыт. Я пытался установить preferredDisplayMode в .PrimaryHidden во многих местах, но это не имеет видимого влияния. Поиск в Google ничего не дал.

1 ответ

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

Я взял эту идею и решил подкласс UISplitViewControllerи переопределить traitCollection имущество. Это сделало трюк:

final class MySplitViewController: UISplitViewController {
  var didOnce = false
  override var traitCollection: UITraitCollection {
    let old = super.traitCollection
    let change = UITraitCollection(horizontalSizeClass: .Compact)
    let new = UITraitCollection(traitsFromCollections: [old, change])
    return new
  }

Очевидно, что это жестко запрограммировано для одного устройства - позже я пойду и добавлю некоторые функции, которые я могу использовать для контроля того, что на самом деле возвращается.

Не отменять traitCollection, вместо этого используйте метод setOverrideTraitCollection:forChildViewController:в родительском контроллере представления вашего разделенного контроллера, как в примере Apple AAPLTraitOverrideViewController.m

Если у вашего сплит-контроллера нет родителя, создать родителя в раскадровке очень просто. Добавьте новый контроллер представления, сделайте его точкой входа, добавьте представление контейнера, удалите встроенное представление по умолчанию и вместо этого добавьте встраиваемый переход к разделенному контроллеру и установите переопределение наself.childViewControllers.firstObject в viewDidLoad.

Другие вопросы по тегам