web-dev-qa-db-fra.com

iPad Paysage et Portrait différentes mises en page avec la classe de taille

Comment concevoir des écrans Paysage et Portrait de l'iPad avec différentes dispositions à l'aide de la classe Size ... Je ne pouvais trouver que les valeurs w-regular et h-regular pour les deux orientations. Exemple: je dois aligner 2 vues verticalement en portrait et horizontalement en paysage à l'aide de Size Class

24
Harish Kumar Kailas

Finalement j'ai trouvé une solution: 

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

Il semble que l'intention d'Apple soit de considérer les deux orientations de l'iPad comme identiques, mais comme nombre d'entre nous le constatons, il existe des raisons très légitimes de vouloir modifier la disposition de l'interface utilisateur pour iPad Portrait ou Paysage pour iPad.

Toutefois, veuillez consulter cette réponse pour une autre approche permettant d’adapter les classes de taille afin de répondre à vos besoins: https://stackoverflow.com/a/28268200/4517929

6
RonDiamond

Pour Swift 3 cela ressemblerait à ceci:

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)
}

Il utilisera wRhC au lieu de wRhR pour les appareils iPad en mode paysage . Mettez ce code dans votre contrôleur de vue de base, autrement dit, cette règle fonctionnera pour tous les contrôleurs présentés par celui-ci .Vous pouvez mettre des conditions supplémentaires ici ... Par exemple, si vous souhaitez que cette règle ne fonctionne que pour un contrôleur de vue spécifique, votre opérateur if ressemblera à ceci:

    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)
}

J'aime créer une sous-classe personnalisée de navigationController, puis définir un contrôleur de navigation initial de storyboards pour cette classe. Vous pouvez également faire quelque chose de similaire avec ViewController .

Exemple:

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)
    }
}

Remarque: vous ne devez pas remplacer traitCollection conformément à la docs

Important

Utilisez directement la propriété traitCollection. Ne pas le remplacer. Ne fournissez pas d'implémentation personnalisée.

0
DoesData