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.
ios
swift
orientation-changes
David
quelle
quelle
Antworten:
So habe ich es zum Laufen gebracht:
In
AppDelegate.swift
diedidFinishLaunchingWithOptions
Funktion habe ich eingefügt:und dann habe ich innerhalb der AppDelegate-Klasse die folgende Funktion eingefügt:
Hoffe das hilft jemand anderem!
Vielen Dank!
quelle
selector
bin neu in der Codierung, sollte aber kein String-Format von"rotated:"
??rotated()
nicht der Fall ist)UIDeviceOrientation
etwas anderes ist alsUIInterfaceOrientation
.. Dies liegt daran, dassUIDeviceOrientation
auch 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)quelle
Ich musste eine Drehung erkennen, während ich die Kamera mit benutzte
AVFoundation
, und stellte fest, dass diedidRotate
( jetzt veralteten ) &willTransition
Methoden 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:
So richten Sie die Benachrichtigung für Swift 4.2 ein :
So brechen Sie die Benachrichtigung für Swift 4.2 ab :
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
@objc
Inferenz 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.
#selector
Daher 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
#selector
Funktion aufgrund der veralteten@objc
Inferenz verwenden:Einstieg in die schnelle Entwicklung zu dieser Änderung .
Richten Sie den Rückruf ein:
Richten Sie die Benachrichtigung ein:
Reiß es nieder:
quelle
Die Verwendung der
-orientation
Eigenschaft vonUIDevice
ist nicht korrekt (auch wenn sie in den meisten Fällen funktionieren könnte) und kann zu einigen Fehlern führen.UIDeviceOrientation
Berü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 derUIInterfaceOrientation
Aufzä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
interfaceOrientation
Eigenschaft für dieUIViewController
Klasse veraltet .Es stehen 2 Optionen zur Verfügung, um die Ausrichtung der Benutzeroberfläche zu ermitteln:
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 :
quelle
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 inObjective-C
:quelle
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:
quelle
didRotateFromInterfaceOrientation()
funktioniert es nicht zuverlässig. Es fehlen einige Umdrehungen.iewWillTransitionToSize:withTransitionCoordinator:
funktioniert okVerwenden Sie die neue viewWillTransitionToSize (_: withTransitionCoordinator :)
quelle
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:
als die Benachrichtigung zwischenzuspeichern
quelle
In Ziel C.
In kurzer Zeit
Überschreiben Sie diese Methode, um die Orientierungsänderung zu erkennen.
quelle
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.
Um dies zu umgehen, können Sie die vorherige Geräteorientierung beibehalten und nach einer Änderung in deviceDidRotate () suchen.
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
UIApplicationDidChangeStatusBarOrientation
Benachrichtigung verwenden.quelle
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 up
undface down
fü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.Die wichtigsten zu beachtenden Stücke sind:
unknown
manchmal eine Ausrichtung vorhanden ist .Hoffe jemand findet das hilfreich.
quelle
quelle
Wenn Sie etwas tun möchten, nachdem die Drehung abgeschlossen ist, können Sie den
UIViewControllerTransitionCoordinator
Abschluss-Handler wie folgt verwendenquelle
Seit iOS 8 ist dies der richtige Weg.
quelle
Ü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:
quelle
Hier ist eine einfache Möglichkeit, die Geräteorientierung zu erkennen: ( Swift 3 )
quelle
willRotate
ist jetzt veraltet, besser nutzenviewWillTransition
.Swift 4:
Viele Antworten helfen nicht, wenn sie über verschiedene Ansichts-Controller hinweg erkannt werden müssen. Dieser macht den Trick.
quelle
viewWillDisappear
und fügen SieaddObserver
inviewDidLoad
. iOS hebt den View Controller automatisch ab.UIDevice.current.orientation.isFlat
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.
Das unten hat funktioniert, aber ich fühlte mich verlegen darüber :)
quelle
Ich benutze
UIUserInterfaceSizeClass
, um eine Orientierung zu erkennen, die sich in einerUIViewController
Klasse einfach so geändert hat :quelle
Für Swift 3
quelle
UIDevice.current.orientation.isFlat
Swift 5
Setup-Klasse zum Empfangen von Benachrichtigungen über Änderungen der Geräteorientierung:
Setup-Handler-Code:
quelle
HINWEIS: Verwenden Sie einfach diesen Code, um zu identifizieren, in welcher Ausrichtung sich UIViewController befindet
quelle
quelle
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.
quelle