Ограничения в строках Ios 8 аналогичны ограничениям iphones

У меня есть эта проблема, когда в ios 8 формула принимает ограничения, установленные для "регулярного -высота" компактной ширины "(то есть всех ограничений iPhones) вместо" any-any "или" regular -width regular -height ". У меня есть два разных дизайна для iPhone и iPad, так как листок использует потребление iPhone iam не в состоянии добиться того же. Любая помощь по этому вопросу будет aprreciatd

Ответ 1

Из ссылки класса UIViewController:

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

В горизонтально компактной среде эта опция ведет себя так же, как UIModalPresentationFullScreen.

Поскольку презентация формы на iPad - это компактная ширина и регулярная высота, это значения, которые вы получите при представлении листа формы.


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

Если ваш контроллер просмотра является контроллером дочернего представления другого, вы можете использовать setOverrideTraitCollection(_:forChildViewController:) и переопределить ограничения класса размера для дочернего контроллера.

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


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

Ответ 2

Я нашел другой способ решить эту проблему для представленных контроллеров представления, таких как листы форм, которые не являются дочерними контроллерами представления.

Я переопределяю viewWillLayoutSubviews а затем макет на основе представленной коллекции признаков контроллера представления.

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    if let presenting = presentingViewController {
        updateLayout(forSizeClass: presenting.traitCollection.horizontalSizeClass)
    }
}

Где updateLayout(forSizeClass:) - это наша функция, которая делает все, что нам нужно для поддержки среды trait.

Преимущество этого подхода заключается в том, что мы не проверяем явно тип устройства (.pad или .phone) и не устанавливаем явно пороговое значение размера представления (которое может измениться в будущем). Этот подход изначально поддерживает разделенное представление iPad, позволяя вашему макету переходить к макету в стиле iPhone, когда контроллер представления представляет класс .compact size.

Основным предположением здесь является то, что ваш представительный контроллер представления является полноэкранным. Но для форм листов это часто бывает.

Ответ 3

Другим решением является использование vc.presentationController.overrideTraitCollection

    // in landscape mode, we want the horizontal traits to be the same as the main screen
    if ( UIScreen.mainScreen.traitCollection.horizontalSizeClass ==  UIUserInterfaceSizeClassRegular){

        //if you use UIModalPresentationFormSheet, the traits horizontal will be compact , even on iPad, so we have tell the presentationcontroller to force the horizontaltraits to regular
        vc.modalPresentationStyle=UIModalPresentationFormSheet;
        vc.presentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular ];
        [_rootViewController presentViewController:vc animated:true completion:^{}];
}