[SWIFT] [IOS] Pour autoriser la rotation d'un écran spécifique uniquement

Aperçu

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.

1. Si vous le faites honnêtement

C'est la méthode la plus orthodoxe. Dans les paramètres généraux

  1. Portrait
  2. Landscape Left
  3. Landscape Right
  4. À l'envers, si nécessaire

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.

2. Lorsque vous souhaitez terminer le processus uniquement sur l'écran cible

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.

3. Retourner la rotation sur l'écran de destination de la transition

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.

Quelles autres méthodes existe-t-il

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

[IOS] Pour autoriser la rotation d'un écran spécifique uniquement
Définir l'heure de LocalDateTime à une heure spécifique
Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
[ruby] Création d'un programme qui ne répond qu'à des conditions spécifiques
Comment créer un écran de démarrage
Lorsque vous souhaitez que Rails désactive une session pour un contrôleur spécifique
[Java] Comment accéder au début d'une chaîne spécifique à l'aide de la classe String
[Swift5] Comment créer un écran de démarrage
Utilisez Stream # collect pour récupérer et répertorier uniquement des champs spécifiques à partir d'une liste Java Bean
Gratter et écrire des éléments spécifiques dans un fichier
Développement d'applications iOS: application Timer (6. Création de l'écran de réglage)
Seul résumé lié à la configuration du tutoriel Rails
[Java] Ajouter des guillemets uniquement à des colonnes CSV spécifiques
Une histoire accro à EntityNotFoundException de getOne de JpaRepository
Faire une marge à gauche du TextField