[SWIFT] [IOS] Zum Drehen nur eines bestimmten Bildschirms

Überblick

Es ist einfach, nicht auf allen Bildschirmen zu drehen, die Drehung auf allen Bildschirmen zuzulassen und nicht nur bestimmte Bildschirme zu drehen, aber ** die Drehung auf bestimmten Bildschirmen zuzulassen ** ist ziemlich mühsam. In diesem Artikel werden verschiedene Methoden aufgeführt. Ich denke, Sie sollten zu jedem Zeitpunkt die beste Methode wählen.

1. Wenn du es ehrlich machst

Dies ist die orthodoxste Methode. In den allgemeinen Einstellungen

  1. Portrait
  2. Landscape Left
  3. Landscape Right
  4. Falls erforderlich, auf den Kopf stellen

Aktivieren Sie das Kontrollkästchen, um die Drehung in den Gesamteinstellungen zuzulassen. Danach lassen Sie in allen Ansichtssteuerungen mit Ausnahme des Bildschirms, den Sie drehen möchten, nur den vertikalen Bildschirm wie folgt zu.

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { .portrait }

Mit den obigen Schritten können Sie nur bestimmte Bildschirme drehbar machen, es bleiben jedoch einige Herausforderungen bestehen. Erstens hat es einen weiten Einflussbereich. Wenn Sie sich in einem frühen Entwicklungsstadium befinden, ist es Ihnen vielleicht egal, aber wenn Sie dies mit einer großen vorhandenen Anwendung tun, die bereits Dutzende von Bildschirmen enthält, ist dies schwierig, da Sie das Verhalten außer dem Bildschirm, den Sie drehen möchten, überprüfen müssen. Wenn Sie in Zukunft einen neuen Bildschirm erstellen, müssen Sie auch den vertikalen Bildschirm zulassen. Wenn Sie eine gemeinsame Klasse wie BaseViewController haben, können Sie diese dort angeben, und die Änderungen sind gering.

2. Wenn Sie den Vorgang nur auf dem Zielbildschirm abschließen möchten

Wenn Sie zuerst ablehnen, berührt diese Methode private Eigenschaften und funktioniert je nach iOS-Version möglicherweise nicht oder wird von der Überprüfung abgelehnt. Methode 1 wirkt sich auf alle Bildschirme aus, die Sie nicht drehen möchten. Diese Methode wird jedoch nur für den Bildschirm ausgeführt, den Sie drehen möchten.

Implementieren Sie zunächst Folgendes in AppDelegate.

    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        if let rootViewController = UIApplication.getTopViewController() {
            //Nur HogeViewController erlaubt die Drehung
            if rootViewController is HogeViewController {
                return .allButUpsideDown
            }
        }
        //Ansonsten nur der vertikale Bildschirm
        return .portrait
    }

Erstellen Sie eine Methode, um den im obigen Code verwendeten Controller für die vorderste Ansicht abzurufen.

extension UIApplication {

    ///Der View Controller wird oben angezeigt
    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
    }
}

Durch die Implementierung des oben genannten ist es möglich, die Drehung nur auf dem Zielbildschirm zuzulassen. Mit diesen allein wird jedoch beim Übergang zu einem anderen Bildschirm während der Drehung auch der andere Bildschirm in einem gedrehten Zustand angezeigt. Daher ist es notwendig, die Drehung des Bildschirms zum Zeitpunkt des Übergangs wie folgt zwangsweise zurückzugeben.

class HogeViewController {
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    
        if self.isMovingFromParentViewController {
            UIDevice.current.setValue(Int(UIInterfaceOrientation.portrait.rawValue), forKey: "orientation")
        }
    }
}

Die Methode des gewaltsamen Rotierens mit UIDevice.current.setValue (Drehrichtung, forKey: "Orientierung") ist bekannt, aber keine legitime Methode, da auf private Eigenschaften zugegriffen wird.

3. Geben Sie die Drehung auf dem Bildschirm für das Übergangsziel zurück

Obwohl der Einflussbereich in Methode 2 kleiner ist, ist der Prozess der Rückgabe der Rotation etwas schwarzmagisch. Daher wird der Vorgang des Zurückgebens der Drehung auf dem Übergangszielbildschirm ausgeführt. Zum Beispiel

FirstViewController -> HogeViewController -> FugaViewController

Wenn dieser Übergang auftreten kann, können Sie die Drehrichtung mit FirstVC und FugaVC explizit angeben.

class FirstViewController {
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { .portrait }
}

class FugaViewController {
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { .portrait }
}

Wenn bei dieser Methode jedoch ein neuer Anschlussdraht aus HogeVC und ein neuer Anschlussdraht aus HogeVC hergestellt wird, muss die Drehrichtung auf die gleiche Weise festgelegt werden. Im Vergleich zu Methode 1 hat sich der Einflussbereich verringert, aber die zukünftige Implementierung scheint immerhin vorsichtig zu sein.

Welche anderen Methoden gibt es?

In monos Folie scheint es, dass es von der Methode unter Verwendung der Aspektorientierung implementiert wird, und es scheint verschiedene Methoden zu geben. Schließlich ist es schwierig, die Rotationssteuerung später hinzuzufügen, daher denke ich, dass es am besten ist, diesen Bereich von Anfang an zu betrachten, wenn dies möglich ist.

Ende

Recommended Posts

[IOS] Zum Drehen nur eines bestimmten Bildschirms
Stellen Sie die Zeit von LocalDateTime auf eine bestimmte Zeit ein
Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen
[ruby] Erstellen eines Programms, das nur auf bestimmte Bedingungen reagiert
So erstellen Sie einen Begrüßungsbildschirm
Wenn Rails eine Sitzung für einen bestimmten Controller deaktivieren soll
[Java] Wie man mit der String-Klasse an die Spitze eines bestimmten Strings kommt
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
Verwenden Sie Stream # collect, um nur bestimmte Felder aus einer Java Bean-Liste abzurufen und aufzulisten
Scraping und Schreiben bestimmter Elemente in eine Datei
iOS App Entwicklung: Timer App (6. Erstellung des Einstellungsbildschirms)
Nur Zusammenfassung zum Einrichten des Rails-Tutorials
[Java] Fügen Sie Anführungszeichen nur zu bestimmten CSV-Spalten hinzu
Eine Geschichte, die süchtig nach EntityNotFoundException von getOne of JpaRepository ist
Machen Sie einen Rand links vom TextField