Saya menggunakan Swift dan saya ingin dapat memuat UIViewController ketika saya memutar ke lanskap, adakah yang bisa mengarahkan saya ke arah yang benar?
Saya tidak dapat menemukan apa pun secara online dan sedikit bingung dengan dokumentasi.
ios
swift
orientation-changes
David
sumber
sumber
Jawaban:
Begini cara saya membuatnya bekerja:
Di
AppDelegate.swift
dalamdidFinishLaunchingWithOptions
fungsi saya meletakkan:dan kemudian di dalam kelas AppDelegate saya meletakkan fungsi berikut:
Semoga ini bisa membantu orang lain!
Terima kasih!
sumber
selector
memiliki format string"rotated:"
??rotated()
tidak)UIDeviceOrientation
ada sesuatu yang berbeda denganUIInterfaceOrientation
.. Ini karenaUIDeviceOrientation
juga mendeteksi orientasi menghadap ke bawah dan menghadap ke atas yang berarti bahwa kode Anda dapat melompat antara potret dan lansekap secara acak jika perangkat Anda bersandar pada permukaan yang hampir datar tetapi sedikit tidak rata (yaitu bergoyang di permukaan yang menonjol) kamera 6 / 6s)sumber
Perlu mendeteksi rotasi saat menggunakan kamera dengan
AVFoundation
, dan menemukan bahwadidRotate
( sekarang sudah usang ) &willTransition
metode tidak dapat diandalkan untuk kebutuhan saya. Menggunakan notifikasi yang diposting oleh David berhasil, tetapi tidak berlaku untuk Swift 3.x / 4.x.Swift 4.2 Nama notifikasi telah diubah.
Nilai penutupan tetap sama dengan Swift 4.0:
Untuk mengatur notifikasi untuk Swift 4.2 :
Untuk meruntuhkan pemberitahuan untuk Swift 4.2 :
Mengenai pernyataan penghentian , komentar awal saya menyesatkan, jadi saya ingin memperbarui itu. Sebagaimana dicatat, penggunaan
@objc
inferensi telah ditinggalkan, yang pada gilirannya diperlukan untuk menggunakan a#selector
. Dengan menggunakan penutupan sebagai gantinya, ini dapat dihindari dan Anda sekarang memiliki solusi yang harus menghindari kerusakan karena memanggil pemilih yang tidak valid.Segala sesuatu di bawah sini sudah usang pada XCode 10 & iOS 4.2
Swift 4.0 Dengan Swift 4.0, Apple telah mendorong kami untuk menghindari penggunaan
#selector
, jadi pendekatan ini menggunakan blok penyelesaian sekarang. Pendekatan ini juga kompatibel dengan Swift 3.x & akan menjadi pendekatan yang disarankan untuk maju.Ini adalah peringatan kompiler yang akan Anda terima dalam proyek Swift 4.x jika Anda menggunakan
#selector
fungsi karena penghentian@objc
inferensi:Entri dalam evolusi cepat pada perubahan ini .
Siapkan panggilan balik:
Siapkan notifikasi:
Runtuhkan:
sumber
Menggunakan
-orientation
properti dariUIDevice
tidak benar (bahkan jika itu bisa bekerja di sebagian besar kasus) dan dapat menyebabkan beberapa bug, misalnyaUIDeviceOrientation
mempertimbangkan juga orientasi perangkat jika menghadap ke atas atau ke bawah, tidak ada pasangan langsung diUIInterfaceOrientation
enum untuk mereka. nilai-nilai.Selain itu, jika Anda mengunci aplikasi Anda dalam beberapa orientasi tertentu, UIDevice akan memberi Anda orientasi perangkat tanpa memperhitungkannya.
Di sisi lain iOS8 telah mencabut
interfaceOrientation
properti diUIViewController
kelas.Ada 2 opsi yang tersedia untuk mendeteksi orientasi antarmuka:
Apa yang masih hilang adalah cara untuk memahami arah perubahan orientasi antarmuka, yang sangat penting selama animasi.
Dalam sesi WWDC 2014 "Lihat kemajuan pengontrol di iOS8" pembicara juga memberikan solusi untuk masalah itu, menggunakan metode yang menggantikan
-will/DidRotateToInterfaceOrientation
.Di sini solusi yang diusulkan sebagian dilaksanakan, info lebih lanjut di sini :
sumber
Saya tahu pertanyaan ini untuk
Swift
, tetapi karena ini adalah salah satu tautan teratas untuk pencarian Google dan jika Anda mencari kode yang sama diObjective-C
:sumber
Mudah, ini berfungsi di iOS8 dan 9 / Swift 2 / Xcode7, cukup masukkan kode ini di dalam viewcontroller.swift Anda. Ini akan mencetak dimensi layar dengan setiap perubahan orientasi, Anda dapat menempatkan kode Anda sendiri sebagai gantinya:
sumber
didRotateFromInterfaceOrientation()
tidak berfungsi dengan baik. Itu melewatkan beberapa rotasi.iewWillTransitionToSize:withTransitionCoordinator:
berfungsi ok.Gunakan viewWillTransitionToSize baru (_: withTransitionCoordinator :)
sumber
Saya suka memeriksa pemberitahuan orientasi karena Anda dapat menambahkan fitur ini di kelas mana pun, tidak perlu tampilan atau pengontrol tampilan. Bahkan dalam delegasi aplikasi Anda.
SWIFT 5:
dari caching notifikasi
sumber
Dalam Tujuan C
Dengan cepat
Ganti metode ini untuk mendeteksi perubahan orientasi.
sumber
Swift 3 | UIDeviceOrientationDidChange Notification Diamati Terlalu Sering
Kode berikut mencetak "deviceDidRotate" setiap kali perangkat Anda mengubah orientasi dalam ruang 3D - terlepas dari perubahan dari orientasi potret ke lanskap. Misalnya, jika Anda memegang telepon dalam orientasi potret dan memiringkannya ke depan dan ke belakang - deviceDidRotate () dipanggil berulang kali.
Untuk mengatasinya, Anda dapat memegang orientasi perangkat sebelumnya dan memeriksa perubahan deviceDidRotate ().
Atau Anda dapat menggunakan notifikasi berbeda yang hanya dipanggil ketika perangkat berubah dari landscape ke portrait. Dalam hal ini Anda ingin menggunakan
UIApplicationDidChangeStatusBarOrientation
notifikasi.sumber
Implementasi kerja penuh bagaimana mendeteksi perubahan orientasi di Swift 3.0.
Saya memilih untuk menggunakan implementasi ini karena orientasi telepon
face up
danface down
penting bagi saya, dan saya ingin pandangan berubah hanya setelah saya tahu orientasi berada di posisi yang ditentukan.Bagian penting yang perlu diperhatikan adalah:
unknown
orientasi di kali.Semoga seseorang menemukan ini bermanfaat.
sumber
sumber
Jika Anda ingin melakukan sesuatu SETELAH rotasi selesai, Anda dapat menggunakan
UIViewControllerTransitionCoordinator
penangan selesai seperti inisumber
Sejak iOS 8 ini adalah cara yang benar untuk melakukannya.
sumber
Periksa apakah rotasi telah berubah dengan:
viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
Dengan
coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext)
Anda dapat memeriksa apakah transisi selesai.Lihat kode di bawah ini:
sumber
Berikut cara mudah mendeteksi orientasi perangkat: ( Swift 3 )
sumber
willRotate
sudah ditinggalkan sekarang, lebih baik digunakanviewWillTransition
.Swift 4:
Banyak jawaban yang tidak membantu ketika perlu mendeteksi berbagai pengontrol tampilan. Yang ini berhasil.
sumber
viewWillDisappear
dan menambahkanaddObserver
diviewDidLoad
. iOS berhenti berlangganan controller tampilan secara otomatis.UIDevice.current.orientation.isFlat
Pendekatan saya mirip dengan apa yang ditampilkan bpedit di atas, tetapi dengan fokus iOS 9+. Saya ingin mengubah ruang lingkup FSCalendar ketika tampilan berputar.
Ini di bawah ini bekerja, tetapi saya merasa malu tentang hal itu :)
sumber
Saya gunakan
UIUserInterfaceSizeClass
untuk mendeteksi orientasi yang berubah diUIViewController
kelas begitu saja:sumber
Untuk Swift 3
sumber
UIDevice.current.orientation.isFlat
Cepat 5
Atur kelas untuk menerima pemberitahuan perubahan orientasi perangkat:
Kode penangan pengaturan:
sumber
CATATAN: Cukup gunakan kode ini untuk mengidentifikasi UIViewController di mana orientasi
sumber
sumber
Dengan iOS 13.1.2, orientasi selalu kembali 0 hingga perangkat diputar. Saya perlu menghubungi UIDevice.current.beginGeneratingDeviceOrientationNotifications () untuk mendapatkan rotasi aktual sebelum terjadi peristiwa rotasi.
sumber