it-swarm.com.ru

iPad Пейзаж и Портрет разные макеты с размером класса

Как проектировать экраны iPad «Пейзаж» и «Портрет» с разными макетами, используя класс «Размер». Я мог найти только w-регулярный и h-регулярный для обеих ориентаций. Пример: мне нужно выровнять 2 вида по вертикали в портретной ориентации и по горизонтали в альбомной ориентации с использованием класса размеров

24
Harish Kumar Kailas

Наконец я нашел решение: 

if traitCollection.verticalSizeClass == .Regular && traitCollection.horizontalSizeClass == .Regular {

     var orientation:UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation;
     if orientation == UIInterfaceOrientation.LandscapeLeft || orientation == UIInterfaceOrientation.LandscapeRight {
            // orientation is landscape


     }  else {
            // orientation is portrait

     }
}
6
cmii

Похоже, что Apple намерена относиться к обеим ориентациям iPad как к одному, но, как выяснили некоторые из нас, есть очень законные причины дизайна, чтобы захотеть изменить макет пользовательского интерфейса для iPad Portrait и iPad Landscape.

Однако, пожалуйста, посмотрите этот ответ для другого подхода к адаптации классов размеров для того, что нам нужно: https://stackoverflow.com/a/28268200/4517929

6
RonDiamond

Для Swift 3 это будет выглядеть так:

override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
    if UI_USER_INTERFACE_IDIOM() == .pad &&
        view.bounds.width > view.bounds.height {

        let collections = [UITraitCollection(horizontalSizeClass: .regular),
                           UITraitCollection(verticalSizeClass: .compact)]
        return UITraitCollection(traitsFrom: collections)

    }

    return super.overrideTraitCollection(forChildViewController: childViewController)
}

Он будет использовать wRhC вместо wRhR для устройств iPad в альбомном режиме .. Поместите этот код в контроллер базового представления, т.е. это правило будет работать для всех контроллеров, представленных этимВы можете поместить здесь любые дополнительные условия ... Например, если вы хотите, чтобы это правило работало только для определенного контроллера представления, ваш оператор if выглядел бы так:

    if UI_USER_INTERFACE_IDIOM() == .pad &&
        childViewController is YourSpecificViewController &&
        view.bounds.width > view.bounds.height {

        let collections = [UITraitCollection(horizontalSizeClass: .regular),
                           UITraitCollection(verticalSizeClass: .compact)]
        return UITraitCollection(traitsFrom: collections)

    }
5
Oleg

Swift 4

override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
    if UIDevice.current.userInterfaceIdiom == .pad && UIDevice.current.orientation.isLandscape {
        return UITraitCollection(traitsFrom:[UITraitCollection(verticalSizeClass: .compact), UITraitCollection(horizontalSizeClass: .regular)])
    }
    return super.overrideTraitCollection(forChildViewController: childViewController)
}

Мне нравится создавать пользовательский подкласс navigationController, а затем устанавливать раскадровку исходного контроллера Navigation в этот класс. Вы также можете сделать что-то подобное с ViewController .

Пример:

import UIKit

class NavigationControllerWithTraitOverride: UINavigationController {

    // If you make a navigationController a member of this class the descendentVCs of that navigationController will have their trait collection overridden with compact vertical size class if the user is on an iPad and the device is horizontal.

    override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
        if UIDevice.current.userInterfaceIdiom == .pad && UIDevice.current.orientation.isLandscape {
            return UITraitCollection(traitsFrom:[UITraitCollection(verticalSizeClass: .compact), UITraitCollection(horizontalSizeClass: .regular)])
        }
        return super.overrideTraitCollection(forChildViewController: childViewController)
    }
}

Примечание: вы не должны переопределять traitCollection в соответствии с docs

Важный

Используйте свойство traitCollection напрямую. Не отменяйте это. Не предоставляйте пользовательскую реализацию.

0
DoesData