Używam Swift i chcę mieć możliwość załadowania kontrolera UIViewController po obróceniu do poziomu. Czy ktoś może wskazać mi właściwy kierunek?
Nie mogę znaleźć niczego w Internecie i jestem trochę zdezorientowany dokumentacją.
ios
swift
orientation-changes
David
źródło
źródło
Odpowiedzi:
Oto jak to działa:
W
AppDelegate.swift
wewnątrzdidFinishLaunchingWithOptions
funkcji I umieścić:a następnie w klasie AppDelegate umieściłem następującą funkcję:
Mam nadzieję, że to pomoże komukolwiek innemu!
Dzięki!
źródło
selector
mieć formatu ciągu znaków"rotated:"
??rotated()
nie jest)UIDeviceOrientation
to coś innego niżUIInterfaceOrientation
... Wynika to z faktu, żeUIDeviceOrientation
wykrywa również orientacje zakryte i odkryte, co oznacza, że kod może losowo przeskakiwać między portretem a krajobrazem, jeśli urządzenie spoczywa na prawie płaskiej, ale nieco nierównej powierzchni (np. Kołysze się na wystającej kamera zźródło
Muszę wykryć obrót podczas używania aparatu z
AVFoundation
i okazało się, żedidRotate
( obecnie przestarzałe ) &willTransition
metody były zawodne dla moich potrzeb. Korzystanie z powiadomienia wysłanego przez Davida zadziałało, ale nie jest aktualne dla Swift 3.x / 4.x.Swift 4.2 Nazwa powiadomienia została zmieniona.
Wartość zamknięcia pozostaje taka sama jak w Swift 4.0:
Aby skonfigurować powiadomienie dla Swift 4.2 :
Aby usunąć powiadomienie dla Swift 4.2 :
Jeśli chodzi o oświadczenie o wycofaniu , mój pierwszy komentarz był mylący, więc chciałem to zaktualizować. Jak wspomniano, użycie
@objc
wnioskowania zostało przestarzałe, co z kolei było potrzebne do korzystania z pliku#selector
. Używając zamiast tego zamknięcia, można tego uniknąć i masz teraz rozwiązanie, które powinno uniknąć awarii z powodu wywołania nieprawidłowego selektora.Wszystko poniżej jest przestarzałe od XCode 10 i iOS 4.2
Swift 4.0 Dzięki Swift 4.0 firma Apple zachęca nas do unikania korzystania z
#selector
, więc to podejście wykorzystuje teraz blok uzupełniania. To podejście jest również wstecznie kompatybilne ze Swift 3.x i byłoby zalecanym podejściem w przyszłości.To jest ostrzeżenie kompilatora, które otrzymasz w projekcie Swift 4.x, jeśli użyjesz
#selector
funkcji z powodu wycofania@objc
wnioskowania:Wejście w szybką ewolucję tej zmiany .
Skonfiguruj wywołanie zwrotne:
Skonfiguruj powiadomienie:
Zburz to:
źródło
Używanie
-orientation
właściwości ofUIDevice
nie jest poprawne (nawet jeśli mogłoby działać w większości przypadków) i może prowadzić do pewnych błędów, na przykład weźUIDeviceOrientation
pod uwagę także orientację urządzenia, jeśli jest ono odkryte lub w dół, nie ma bezpośredniej pary wUIInterfaceOrientation
wyliczeniu dla tych wartości.Ponadto, jeśli zablokujesz aplikację w określonej orientacji, UIDevice poda orientację urządzenia bez uwzględnienia tego.
Z drugiej strony iOS8 wycofał
interfaceOrientation
właściwośćUIViewController
klasy.Dostępne są 2 opcje wykrywania orientacji interfejsu:
Brakuje jeszcze sposobu zrozumienia kierunku zmiany orientacji interfejsu, co jest bardzo ważne podczas animacji.
W sesji WWDC 2014 „Zobacz postęp kontrolera w iOS8” prelegent również przedstawia rozwiązanie tego problemu, stosując metodę, która zastępuje
-will/DidRotateToInterfaceOrientation
.Tutaj proponowane rozwiązanie częściowo wdrożone, więcej informacji tutaj :
źródło
Wiem, że to pytanie jest dla
Swift
, ale ponieważ jest to jeden z najlepszych linków do wyszukiwania Google i jeśli szukasz tego samego kodu wObjective-C
:źródło
Spokojnie, działa to w iOS8 i 9 / Swift 2 / Xcode7, po prostu umieść ten kod w swoim viewcontroller.swift. Wydrukuje wymiary ekranu przy każdej zmianie orientacji, możesz zamiast tego umieścić własny kod:
źródło
didRotateFromInterfaceOrientation()
że jest przestarzały, nie działa niezawodnie. Brakuje niektórych obrotów.iewWillTransitionToSize:withTransitionCoordinator:
działa dobrze.Użyj nowego viewWillTransitionToSize (_: withTransitionCoordinator :)
źródło
Lubię sprawdzać powiadomienie o orientacji, ponieważ możesz dodać tę funkcję w dowolnej klasie, nie musi być widokiem ani kontrolerem widoku. Nawet w delegacie aplikacji.
SWIFT 5:
niż buforowanie powiadomienia
źródło
W celu C
Szybko
Zastąp tę metodę, aby wykryć zmianę orientacji.
źródło
Swift 3 | UIDeviceOrientationDidChange Powiadomienie obserwowane zbyt często
Poniższy kod drukuje „deviceDidRotate” za każdym razem, gdy urządzenie zmieni orientację w przestrzeni 3D - niezależnie od zmiany orientacji z pionowej na poziomą. Na przykład, jeśli trzymasz telefon w orientacji pionowej i przechylasz go do przodu i do tyłu - urządzenie deviceDidRotate () jest wywoływane wielokrotnie.
Aby obejść ten problem, możesz przytrzymać poprzednią orientację urządzenia i sprawdzić, czy nastąpiła zmiana w deviceDidRotate ().
Możesz też użyć innego powiadomienia, które jest wywoływane tylko wtedy, gdy urządzenie zmieni się z poziomego na pionowe. W takim przypadku chcesz skorzystać z
UIApplicationDidChangeStatusBarOrientation
powiadomienia.źródło
Pełna funkcjonalna implementacja sposobu wykrywania zmiany orientacji w Swift 3.0.
Zdecydowałem się skorzystać z tej implementacji, ponieważ orientacje telefonu
face up
iface down
były dla mnie ważne, a chciałem, aby widok zmieniał się tylko wtedy, gdy wiedziałem, że orientacja jest w określonej pozycji.Ważne elementy, na które należy zwrócić uwagę, to:
unknown
czasami jest orientacja.Mam nadzieję, że ktoś uzna to za pomocne.
źródło
źródło
Jeśli chcesz coś zrobić PO zakończeniu rotacji, możesz użyć
UIViewControllerTransitionCoordinator
procedury obsługi zakończenia w ten sposóbźródło
Od iOS 8 jest to właściwy sposób na zrobienie tego.
źródło
Sprawdź, czy rotacja zmieniła się z:
viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
Z
coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext)
można sprawdzić, czy przejście jest zakończona.Zobacz kod poniżej:
źródło
Oto prosty sposób na wykrycie orientacji urządzenia: ( Swift 3 )
źródło
willRotate
jest teraz przestarzały, lepiej go używaćviewWillTransition
.Swift 4:
Wiele odpowiedzi nie pomaga, gdy trzeba wykryć różne kontrolery widoku. Ten załatwia sprawę.
źródło
viewWillDisappear
i dodaćaddObserver
wviewDidLoad
. iOS automatycznie anuluje subskrypcję kontrolera widoku.UIDevice.current.orientation.isFlat
Moje podejście jest podobne do tego, co pokazuje bpedit powyżej, ale koncentruje się na iOS 9+. Chciałem zmienić zakres FSCalendar, gdy widok się obraca.
To poniżej działało, ale czułem się z tego powodu zakłopotany :)
źródło
Używam
UIUserInterfaceSizeClass
do wykrywania zmiany orientacji wUIViewController
klasie, po prostu:źródło
Dla Swift 3
źródło
UIDevice.current.orientation.isFlat
Szybki 5
Skonfiguruj klasę, aby otrzymywać powiadomienia o zmianie orientacji urządzenia:
Kod obsługi konfiguracji:
źródło
UWAGA: Po prostu użyj tego kodu, aby zidentyfikować UIViewController, w której orientacji
źródło
źródło
W iOS 13.1.2 orientacja zawsze zwraca 0 do momentu obrócenia urządzenia. Muszę zadzwonić do UIDevice.current.beginGeneratingDeviceOrientationNotifications (), aby uzyskać rzeczywistą rotację przed wystąpieniem jakiegokolwiek zdarzenia rotacji.
źródło