Wie erkennt man Orientierungsänderungen?


148

Ich verwende Swift und möchte einen UIViewController laden können, wenn ich mich in den Querformat drehe. Kann mich jemand in die richtige Richtung weisen?

Ich kann online nichts finden und bin durch die Dokumentation etwas verwirrt.


1
Ich nehme an, dass sich die API nicht geändert hat, also sollte es "didRotateToOrientation" und "willRotateToOrientation" sein. Schauen Sie sich die Apple-Dokumentation an
David 'mArm' Ansermot

1
Hi @ mArm.ch, danke für die schnelle Antwort! Wie würde ich das umsetzen? (Dies ist meine erste App ... Ich bin sehr neu in IOS) :)
David

Ich habe als Antwort für andere Leute neu gepostet. Kannst du es akzeptieren, wenn es für dich in Ordnung ist?
David 'mArm' Ansermot

Antworten:


194

So habe ich es zum Laufen gebracht:

In AppDelegate.swiftdie didFinishLaunchingWithOptions Funktion habe ich eingefügt:

NotificationCenter.default.addObserver(self, selector: #selector(AppDelegate.rotated), name: UIDevice.orientationDidChangeNotification, object: nil)

und dann habe ich innerhalb der AppDelegate-Klasse die folgende Funktion eingefügt:

func rotated() {
    if UIDeviceOrientationIsLandscape(UIDevice.current.orientation) {
        print("Landscape")
    }

    if UIDeviceOrientationIsPortrait(UIDevice.current.orientation) {
        print("Portrait")
    }
}

Hoffe das hilft jemand anderem!

Vielen Dank!


5
Ich habe versucht, den addObserver im AppDelegate hinzuzufügen, habe aber weiterhin ein SIGABRT in CoreFoundation mit einem nicht erkannten Selektor erhalten. Als ich den addObserver in meiner ersten Ansicht auf viewDidLoad verschoben habe, hat es jedoch einwandfrei funktioniert. Nur zur Information, wenn jemand auf dasselbe Problem stößt.
FractalDoctor

1
Ich selectorbin neu in der Codierung, sollte aber kein String-Format von "rotated:"??
Chamäleon

4
Ich bin mir ziemlich sicher, dass das nur ist, wenn Sie Argumente akzeptieren (was rotated()nicht der Fall ist)
David

26
Seien Sie vorsichtig, da dies UIDeviceOrientationetwas anderes ist als UIInterfaceOrientation.. Dies liegt daran, dass UIDeviceOrientationauch verdeckte und verdeckte Ausrichtungen erkannt werden, was bedeutet, dass Ihr Code zufällig zwischen Hoch- und Querformat wechseln kann, wenn Ihr Gerät auf einer fast flachen, aber leicht unebenen Oberfläche ruht (dh auf dem hervorstehenden Teil schaukelt) Kamera der 6 / 6s)
Liamnichols

4
Diese Methode funktioniert NICHT, wenn das Telefon die automatische Drehung deaktiviert hat.
Chengsam

178
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape {
        print("Landscape")
    }
    if UIDevice.current.orientation.isFlat {
        print("Flat")
    } else {
        print("Portrait")
    }
}

71
Dies wird VOR der Drehung aufgerufen. Wenn Sie zB die Rahmengröße nach der Drehung benötigen, funktioniert diese Lösung nicht.
Upvote

hat in der Erweiterung nicht funktioniert. Landschaft oder Porträt drucken noch "Porträt"
TomSawyer

4
Diese Methode funktioniert NICHT, wenn das Telefon die automatische Drehung deaktiviert hat.
Chengsam

5
Auf dem iPad wird diese Methode nie aufgerufen, da die Größenklasse für Quer- und Hochformat gleich ist.
Jacky

Dies schlägt auch fehl, wenn das Gerät isFlat zurückgibt. developer.apple.com/documentation/uikit/uideviceorientation/…
CodeBender

57

Ich musste eine Drehung erkennen, während ich die Kamera mit benutzte AVFoundation, und stellte fest, dass die didRotate( jetzt veralteten ) & willTransitionMethoden für meine Bedürfnisse unzuverlässig waren. Die Verwendung der von David geposteten Benachrichtigung hat funktioniert, ist jedoch für Swift 3.x / 4.x nicht aktuell.

Swift 4.2 Der Benachrichtigungsname wurde geändert.

Der Schließwert bleibt der gleiche wie bei Swift 4.0:

var didRotate: (Notification) -> Void = { notification in
        switch UIDevice.current.orientation {
        case .landscapeLeft, .landscapeRight:
            print("landscape")
        case .portrait, .portraitUpsideDown:
            print("Portrait")
        default:
            print("other")
        }
    }

So richten Sie die Benachrichtigung für Swift 4.2 ein :

NotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification,
                                       object: nil,
                                       queue: .main,
                                       using: didRotate)

So brechen Sie die Benachrichtigung für Swift 4.2 ab :

NotificationCenter.default.removeObserver(self,
                                          name: UIDevice.orientationDidChangeNotification,
                                          object: nil)

In Bezug auf die Abschreibungserklärung war mein erster Kommentar irreführend, daher wollte ich ihn aktualisieren. Wie bereits erwähnt, wurde die Verwendung von @objcInferenz veraltet, was wiederum für die Verwendung von a erforderlich war #selector. Durch die Verwendung eines Verschlusses kann dies vermieden werden, und Sie haben jetzt eine Lösung, die einen Absturz aufgrund des Aufrufs eines ungültigen Selektors vermeiden sollte.

Alles, was hier unten steht, ist ab XCode 10 und iOS 4.2 veraltet

Swift 4.0 Mit Swift 4.0 hat Apple uns ermutigt, die Verwendung von zu vermeiden. #selectorDaher verwendet dieser Ansatz jetzt einen Abschlussblock. Dieser Ansatz ist auch abwärtskompatibel mit Swift 3.x und wird in Zukunft empfohlen.

Dies ist die Compiler-Warnung, die Sie in einem Swift 4.x-Projekt erhalten, wenn Sie die #selectorFunktion aufgrund der veralteten @objcInferenz verwenden:

Geben Sie hier die Bildbeschreibung ein

Einstieg in die schnelle Entwicklung zu dieser Änderung .

Richten Sie den Rückruf ein:

// If you do not use the notification var in your callback, 
// you can safely replace it with _
    var didRotate: (Notification) -> Void = { notification in
        switch UIDevice.current.orientation {
        case .landscapeLeft, .landscapeRight:
            print("landscape")
        case .portrait, .portraitUpsideDown:
            print("Portrait")
        default:
            print("other")
        }
    }

Richten Sie die Benachrichtigung ein:

NotificationCenter.default.addObserver(forName: .UIDeviceOrientationDidChange,
                                       object: nil,
                                       queue: .main,
                                       using: didRotate)

Reiß es nieder:

NotificationCenter.default.removeObserver(self, name: .UIDeviceOrientationDidChange, object: nil)

4
Haben Sie einen Hinweis darauf, wo Apple davon spricht, von der Verwendung von #selector in Swift 4 abzuraten? Ich würde gerne nachlesen, warum sie das sagen.
Jeffjv

@jeffjv Natürlich habe ich keinen direkten Link zu einem Apple-Dokument, aber ich habe einen Screenshot der Compiler-Warnung eingefügt, die XCode bereitstellt, wenn Sie den vorherigen Ansatz verwenden.
CodeBender

1
Ich habe einen Link zu Swift-Evolution hinzugefügt, der die Änderung beschreibt.
CodeBender

1
@CodeBender: Die Compiler-Warnung bedeutet nicht, was Sie vorschlagen. #selector wird nicht abgeschrieben, sondern nur "@objc". Dies bedeutet, dass Sie eine Funktion als #selector explizit markieren müssen, damit der Compiler den zusätzlichen korrekten Code generiert, da der Compiler nicht mehr versucht, ihn aus Ihrer Verwendung abzuleiten. Wenn Sie also Ihrer rotate () - Funktion in Ihrer Swift 3.0-Lösung "@obj" hinzufügen, wird der Code ohne Warnung kompiliert.
Mythlandia

Vielen Dank an @Mythlandia, ich habe die Antwort aktualisiert, um die Verwirrung über meine ursprüngliche Aussage zu beseitigen.
CodeBender

19

Die Verwendung der -orientationEigenschaft von UIDeviceist nicht korrekt (auch wenn sie in den meisten Fällen funktionieren könnte) und kann zu einigen Fehlern führen. UIDeviceOrientationBerücksichtigen Sie beispielsweise auch die Ausrichtung des Geräts, wenn es nach oben oder unten zeigt. Für diese gibt es kein direktes Paar in der UIInterfaceOrientationAufzählung Werte.
Wenn Sie Ihre App in einer bestimmten Ausrichtung sperren, gibt Ihnen UIDevice außerdem die Geräteorientierung, ohne dies zu berücksichtigen.
Auf der anderen Seite hat iOS8 die interfaceOrientationEigenschaft für die UIViewControllerKlasse veraltet .
Es stehen 2 Optionen zur Verfügung, um die Ausrichtung der Benutzeroberfläche zu ermitteln:

  • Verwenden Sie die Ausrichtung der Statusleiste
  • Verwenden Sie Größenklassen. Wenn diese auf dem iPhone nicht überschrieben werden, können Sie die aktuelle Ausrichtung der Benutzeroberfläche besser verstehen

Was noch fehlt, ist eine Möglichkeit, die Richtung einer Änderung der Schnittstellenorientierung zu verstehen, die bei Animationen sehr wichtig ist.
In der Sitzung der WWDC 2014 "View Controller Advancement in iOS8" bietet der Sprecher auch eine Lösung für dieses Problem mit der Methode, die ersetzt -will/DidRotateToInterfaceOrientation.

Hier wurde die vorgeschlagene Lösung teilweise implementiert, weitere Infos hier :

func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        let orientation = orientationFromTransform(coordinator.targetTransform())
        let oldOrientation = UIApplication.sharedApplication().statusBarOrientation
        myWillRotateToInterfaceOrientation(orientation,duration: duration)
        coordinator.animateAlongsideTransition({ (ctx) in
            self.myWillAnimateRotationToInterfaceOrientation(orientation,
            duration:duration)
            }) { (ctx) in
                self.myDidAnimateFromInterfaceOrientation(oldOrientation)
        }
    }

11

Ich weiß, dass diese Frage für ist Swift, aber da es einer der Top-Links für eine Google-Suche ist und Sie nach dem gleichen Code suchen in Objective-C:

// add the observer
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotated:) name:UIDeviceOrientationDidChangeNotification object:nil];

// remove the observer
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];

// method signature
- (void)rotated:(NSNotification *)notification {
    // do stuff here
}

11

Ganz einfach, dies funktioniert in iOS8 und 9 / Swift 2 / Xcode7. Fügen Sie diesen Code einfach in Ihren viewcontroller.swift ein. Bei jeder Änderung der Ausrichtung werden die Bildschirmabmessungen gedruckt. Sie können stattdessen Ihren eigenen Code eingeben:

override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
        getScreenSize()
    }
    var screenWidth:CGFloat=0
    var screenHeight:CGFloat=0
    func getScreenSize(){
        screenWidth=UIScreen.mainScreen().bounds.width
        screenHeight=UIScreen.mainScreen().bounds.height
        print("SCREEN RESOLUTION: "+screenWidth.description+" x "+screenHeight.description)
    }

5
Diese Funktion war veraltet. Verwenden Sie stattdessen "viewWillTransitionToSize: withTransitionCoordinator:"
Masa S-AiYa

Abgesehen davon, dass es veraltet ist, didRotateFromInterfaceOrientation()funktioniert es nicht zuverlässig. Es fehlen einige Umdrehungen. iewWillTransitionToSize:withTransitionCoordinator:funktioniert ok
Andrej

@ Andrej Viele Dinge sind jetzt dank Swift 3
Josh


9

Ich überprüfe gerne die Orientierungsbenachrichtigung, da Sie diese Funktion in jeder Klasse hinzufügen können, ohne dass eine Ansicht oder ein Ansichtscontroller erforderlich ist. Auch in Ihrem App-Delegaten.

SWIFT 5:

    //ask the system to start notifying when interface change
    UIDevice.current.beginGeneratingDeviceOrientationNotifications()
    //add the observer
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(orientationChanged(notification:)),
        name: UIDevice.orientationDidChangeNotification,
        object: nil)

als die Benachrichtigung zwischenzuspeichern

    @objc func orientationChanged(notification : NSNotification) {
        //your code there
    }

8

In Ziel C.

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

In kurzer Zeit

func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

Überschreiben Sie diese Methode, um die Orientierungsänderung zu erkennen.


8

Swift 3 | Zu oft beobachtete UIDeviceOrientationDidChange-Benachrichtigung

Der folgende Code druckt "deviceDidRotate" jedes Mal, wenn Ihr Gerät die Ausrichtung im 3D-Raum ändert - unabhängig von einer Änderung von Hoch- zu Querformat. Wenn Sie beispielsweise Ihr Telefon im Hochformat halten und es vorwärts und rückwärts neigen, wird deviceDidRotate () wiederholt aufgerufen.

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(
        self, 
        selector:  #selector(deviceDidRotate), 
        name: .UIDeviceOrientationDidChange, 
        object: nil
    )
}

func deviceDidRotate() {
    print("deviceDidRotate")
}

Um dies zu umgehen, können Sie die vorherige Geräteorientierung beibehalten und nach einer Änderung in deviceDidRotate () suchen.

var previousDeviceOrientation: UIDeviceOrientation = UIDevice.current.orientation

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(
        self, 
        selector:  #selector(deviceDidRotate), 
        name: .UIDeviceOrientationDidChange, 
        object: nil
    )
}

func deviceDidRotate() {
    if UIDevice.current.orientation == previousDeviceOrientation { return }
    previousDeviceOrientation = UIDevice.current.orientation
    print("deviceDidRotate")
}

Oder Sie können eine andere Benachrichtigung verwenden, die nur aufgerufen wird, wenn das Gerät von Querformat zu Hochformat wechselt. In diesem Fall möchten Sie die UIApplicationDidChangeStatusBarOrientationBenachrichtigung verwenden.

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(
        self, 
        selector:  #selector(deviceDidRotate), 
        name: .UIApplicationDidChangeStatusBarOrientation, 
        object: nil
    )
}

func deviceDidRotate() {
    print("deviceDidRotate")
}

6

Vollständige Implementierung der Erkennung von Orientierungsänderungen in Swift 3.0.

Ich habe mich für diese Implementierung entschieden, weil die Telefonausrichtungen von face upund face downfür mich wichtig waren und ich wollte, dass sich die Ansicht erst ändert, wenn ich weiß, dass sich die Ausrichtung an der angegebenen Position befindet.

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //1
        NotificationCenter.default.addObserver(self, selector: #selector(deviceOrientationDidChange), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)

    }

    deinit {
        //3
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
    }

    func deviceOrientationDidChange() {
        //2
        switch UIDevice.current.orientation {
        case .faceDown:
            print("Face down")
        case .faceUp:
            print("Face up")
        case .unknown:
            print("Unknown")
        case .landscapeLeft:
            print("Landscape left")
        case .landscapeRight:
            print("Landscape right")
        case .portrait:
            print("Portrait")
        case .portraitUpsideDown:
            print("Portrait upside down")
        }
    }

}

Die wichtigsten zu beachtenden Stücke sind:

  1. Sie hören den Benachrichtigungsstrom DeviceOrientationDidChange ab und binden ihn an die Funktion deviceOrientationDidChange
  2. Sie schalten dann die Geräteorientierung ein und achten darauf, dass unknownmanchmal eine Ausrichtung vorhanden ist .
  3. Stellen Sie wie bei jeder Benachrichtigung sicher, dass Sie den Benachrichtigungsstrom nicht mehr beobachten, bevor Sie den viewController deinitialisieren.

Hoffe jemand findet das hilfreich.


Danke, großartig
Mohammad Razipour

Ich bin also verwirrt, derzeit passen sich alle meine Ansichten basierend auf Hoch- und Querformat an, aber es ändert sich nicht, wenn das Gerät offen ist. Wie würde ich Ihren obigen Code verwenden, um den gleichen Effekt zu erzielen, wenn er offen ist?
Famic Tech

Können Sie etwas mehr Kontext geben? Ich bin mir nicht sicher, auf welchen Effekt Sie sich beziehen. Dieser Code erkennt einfach die Ausrichtung. Wenn Sie mehrere Methoden zum Erkennen der Ausrichtung verwenden, können Probleme auftreten.
Rob Norback

6
override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) {
    //swift 3
    getScreenSize()
}


func getScreenSize(){
   let screenWidth = UIScreen.main.bounds.width
   let  screenHeight = UIScreen.main.bounds.height
    print("SCREEN RESOLUTION: \(screenWidth.description) x \(screenHeight.description)")
}

Sauberste Antwort. Hat für mich gearbeitet.
Dorad

Dies ist jetzt veraltet
Aziz Javed

5

Wenn Sie etwas tun möchten, nachdem die Drehung abgeschlossen ist, können Sie den UIViewControllerTransitionCoordinatorAbschluss-Handler wie folgt verwenden

public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    // Hook in to the rotation animation completion handler
    coordinator.animate(alongsideTransition: nil) { (_) in
        // Updates to your UI...
        self.tableView.reloadData()
    }
}

5

Seit iOS 8 ist dies der richtige Weg.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { context in
        // This is called during the animation
    }, completion: { context in
        // This is called after the rotation is finished. Equal to deprecated `didRotate`
    })
}

4

Überprüfen Sie, ob sich die Drehung geändert hat mit: viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

Mit dem coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext) Sie überprüfen, ob der Übergang abgeschlossen ist.

Siehe Code unten:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext) in
        // if you want to execute code after transition finished
        print("Transition finished")
    }

    if size.height < size.width {
        // Landscape
        print("Landscape")
    } else {
        // Portrait
        print("Portrait")
    }

}

4

Hier ist eine einfache Möglichkeit, die Geräteorientierung zu erkennen: ( Swift 3 )

override func willRotate(to toInterfaceOrientation: UIInterfaceOrientation, duration: TimeInterval) {
            handleViewRotaion(orientation: toInterfaceOrientation)
        }

    //MARK: - Rotation controls
    func handleViewRotaion(orientation:UIInterfaceOrientation) -> Void {
        switch orientation {
        case .portrait :
            print("portrait view")
            break
        case .portraitUpsideDown :
            print("portraitUpsideDown view")
            break
        case .landscapeLeft :
            print("landscapeLeft view")
            break
        case .landscapeRight :
            print("landscapeRight view")
            break
        case .unknown :
            break
        }
    }

2
willRotateist jetzt veraltet, besser nutzen viewWillTransition.
vor dem

4

Swift 4:

override func viewWillAppear(_ animated: Bool) {
    NotificationCenter.default.addObserver(self, selector: #selector(deviceRotated), name: UIDevice.orientationDidChangeNotification, object: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self, name: UIDevice.orientationDidChangeNotification, object: nil)
}

@objc func deviceRotated(){
    if UIDevice.current.orientation.isLandscape {
        //Code here
    } else {
        //Code here
    }
}

Viele Antworten helfen nicht, wenn sie über verschiedene Ansichts-Controller hinweg erkannt werden müssen. Dieser macht den Trick.


Sie müssen auch überprüfen, ob das Gerät gedreht wurde, während der Ansichts-Controller verschwunden ist (falls ein anderer Ansichts-Controller über dem aktuellen Wert geöffnet ist). In der Tat können Sie überspringen viewWillDisappearund fügen Sie addObserverin viewDidLoad. iOS hebt den View Controller automatisch ab.
Alexander Volkov

Sie haben vergessenUIDevice.current.orientation.isFlat
user924

3

Mein Ansatz ähnelt dem, was bpedit oben zeigt, jedoch mit einem Fokus auf iOS 9+. Ich wollte den Bereich des FSCalendar ändern, wenn sich die Ansicht dreht.

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    coordinator.animateAlongsideTransition({ (context) in
        if size.height < size.width {
            self.calendar.setScope(.Week, animated: true)
            self.calendar.appearance.cellShape = .Rectangle
        }
        else {
            self.calendar.appearance.cellShape = .Circle
            self.calendar.setScope(.Month, animated: true)

        }

        }, completion: nil)
}

Das unten hat funktioniert, aber ich fühlte mich verlegen darüber :)

coordinator.animateAlongsideTransition({ (context) in
        if size.height < size.width {
            self.calendar.scope = .Week
            self.calendar.appearance.cellShape = .Rectangle
        }
        }) { (context) in
            if size.height > size.width {
                self.calendar.scope = .Month
                self.calendar.appearance.cellShape = .Circle
            }
    }

2

Ich benutze UIUserInterfaceSizeClass, um eine Orientierung zu erkennen, die sich in einer UIViewControllerKlasse einfach so geändert hat :

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

    let isiPadLandscapePortrait = newCollection.horizontalSizeClass == .regular && newCollection.verticalSizeClass == .regular
    let isiPhonePlustLandscape = newCollection.horizontalSizeClass == .regular && newCollection.verticalSizeClass == .compact
    let isiPhonePortrait = newCollection.horizontalSizeClass == .compact && newCollection.verticalSizeClass == .regular
    let isiPhoneLandscape = newCollection.horizontalSizeClass == .compact && newCollection.verticalSizeClass == .compact

     if isiPhonePortrait {
         // do something...
     }
}

1

Für Swift 3

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape {
        //Landscape
    }
    else if UIDevice.current.orientation.isFlat {
        //isFlat
    }
    else {
        //Portrait
    }
}

Sie haben vergessenUIDevice.current.orientation.isFlat
user924

1

Swift 5

Setup-Klasse zum Empfangen von Benachrichtigungen über Änderungen der Geräteorientierung:

class MyClass {

    ...

    init (...) {

        ...

        super.init(...)

        // subscribe to device orientation change notifications
        UIDevice.current.beginGeneratingDeviceOrientationNotifications()
        NotificationCenter.default.addObserver(self, selector: #selector(orientationChanged), name: UIDevice.orientationDidChangeNotification, object: nil)

        ...

    }

    ...

}

Setup-Handler-Code:

@objc extension MyClass {
    func orientationChanged(_ notification: NSNotification) {
        let device = notification.object as! UIDevice
        let deviceOrientation = device.orientation

        switch deviceOrientation {
        case .landscapeLeft:   //do something for landscape left
        case .landscapeRight:  //do something for landscape right
        case .portrait:        //do something for portrait
        case .portraitUpsideDown: //do something for portrait upside-down 
        case .faceDown:        //do something for face down
        case .faceUp:          //do something for face up
        case .unknown:         //handle unknown
        @unknown default:      //handle unknown default
        }
    }
}

0
- (void)viewDidLoad {
  [super viewDidLoad];
  [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(OrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
}

-(void)OrientationDidChange:(NSNotification*)notification {
  UIDeviceOrientation Orientation=[[UIDevice currentDevice]orientation];

  if(Orientation==UIDeviceOrientationLandscapeLeft || Orientation==UIDeviceOrientationLandscapeRight) {
    NSLog(@"Landscape");
  } else if(Orientation==UIDeviceOrientationPortrait) {
    NSLog(@"Potrait Mode");
  }
}

HINWEIS: Verwenden Sie einfach diesen Code, um zu identifizieren, in welcher Ausrichtung sich UIViewController befindet


Ihr Code funktioniert im Projekt nicht. Muss ich noch etwas tun?
Syed Ali Salman

0
override func viewDidLoad() {
    NotificationCenter.default.addObserver(self, selector: #selector(MyController.rotated), name: UIDevice.orientationDidChangeNotification, object: nil)
//...
}

@objc
private func rotated() {
    if UIDevice.current.orientation.isLandscape {

    } else if UIDevice.current.orientation.isPortrait {

    }

    //or you can check orientation separately UIDevice.current.orientation
    //portrait, portraitUpsideDown, landscapeLeft, landscapeRight... 

}

0

Unter iOS 13.1.2 gibt die Ausrichtung immer 0 zurück, bis das Gerät gedreht wird. Ich muss UIDevice.current.beginGeneratingDeviceOrientationNotifications () aufrufen, um die tatsächliche Rotation abzurufen, bevor ein Rotationsereignis auftritt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.