Il est facile de ne pas faire pivoter sur tous les écrans, autoriser la rotation sur tous les écrans et ne pas faire pivoter uniquement des écrans spécifiques, mais ** autoriser la rotation sur des écrans spécifiques ** est assez gênant. Cet article répertorie plusieurs méthodes, je pense donc que vous devriez prendre la meilleure méthode à tout moment.
C'est la méthode la plus orthodoxe. Dans les paramètres généraux
Cochez la case pour autoriser la rotation dans les paramètres généraux. Après cela, dans tous les contrôleurs d'affichage à l'exception de l'écran que vous souhaitez faire pivoter, autorisez uniquement l'écran vertical comme suit.
override var supportedInterfaceOrientations: UIInterfaceOrientationMask { .portrait }
Avec les étapes ci-dessus, vous ne pouvez rendre rotatifs que certains écrans, mais certains défis demeurent. Premièrement, il a un large éventail d'influence. Si vous êtes aux premiers stades du développement, cela ne vous dérange peut-être pas, mais si vous faites cela avec une grande application existante qui a déjà des dizaines d'écrans, c'est difficile car vous devez vérifier le comportement autre que l'écran que vous souhaitez faire pivoter. De plus, lors de la création d'un nouvel écran à l'avenir, nous devons nous rappeler de n'autoriser que l'écran vertical. Si vous avez une classe commune comme BaseViewController, vous pouvez la spécifier ici et les modifications seront minimes.
Si vous refusez d'abord, cette méthode touche les propriétés privées et peut ne pas fonctionner selon la version iOS, ou elle peut être rejetée par l'examen. La méthode 1 affectera tous les écrans que vous ne souhaitez pas faire pivoter, mais cette méthode n'est effectuée que pour l'écran que vous souhaitez faire pivoter.
Tout d'abord, implémentez ce qui suit dans AppDelegate.
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if let rootViewController = UIApplication.getTopViewController() {
//Seul HogeViewController autorise la rotation
if rootViewController is HogeViewController {
return .allButUpsideDown
}
}
//A part ça, seul l'écran vertical
return .portrait
}
Créez une méthode pour obtenir le contrôleur de vue le plus avant utilisé dans le code ci-dessus.
extension UIApplication {
///Obtenez le contrôleur de vue affiché en haut
static func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
if let nav = base as? UINavigationController {
return getTopViewController(base: nav.visibleViewController)
} else if let tab = base as? UITabBarController, let selected = tab.selectedViewController {
return getTopViewController(base: selected)
} else if let presented = base?.presentedViewController {
return getTopViewController(base: presented)
}
return base
}
}
En mettant en œuvre ce qui précède, il est possible d'autoriser la rotation uniquement sur l'écran cible. Cependant, avec ceux-ci seuls, lors de la transition vers un autre écran pendant la rotation, l'autre écran sera également affiché dans un état de rotation. Par conséquent, il est nécessaire de forcer le retour de la rotation de l'écran au moment de la transition comme suit.
class HogeViewController {
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if self.isMovingFromParentViewController {
UIDevice.current.setValue(Int(UIInterfaceOrientation.portrait.rawValue), forKey: "orientation")
}
}
}
ʻUIDevice.current.setValue (sens de rotation, forKey: "orientation") ʻest une technique bien connue de rotation forcée, mais ce n'est pas une méthode légitime car elle accède à des propriétés privées.
Bien que la plage d'influence soit plus petite dans la méthode 2, le processus de retour de la rotation est quelque peu magique noir. Par conséquent, le processus de retour de la rotation est effectué sur l'écran de destination de transition. Par exemple
FirstViewController -> HogeViewController -> FugaViewController
Si cette transition peut se produire, vous pouvez spécifier explicitement le sens de rotation avec FirstVC et FugaVC.
class FirstViewController {
override var supportedInterfaceOrientations: UIInterfaceOrientationMask { .portrait }
}
class FugaViewController {
override var supportedInterfaceOrientations: UIInterfaceOrientationMask { .portrait }
}
Cependant, lors de l'utilisation de cette méthode, lorsqu'un nouveau fil conducteur est fabriqué à partir de HogeVC et lorsqu'un nouveau fil conducteur est fabriqué vers HogeVC, il est nécessaire de fixer le sens de rotation de la même manière. Par rapport à la méthode 1, la gamme d'influence a diminué, mais après tout, la mise en œuvre future semble devoir être prudente.
Dans diapo de mono, il semble qu'il soit implémenté par la méthode utilisant l'orientation aspect, et il semble y avoir différentes méthodes. Après tout, il est difficile d'ajouter un contrôle de rotation plus tard, donc je pense qu'il est préférable de considérer ce domaine dès le début si possible.
fin
Recommended Posts