Sebelum iOS 8, kami menggunakan kode di bawah ini dalam hubungannya dengan metode InterfaceOrientations yang didukung dan metode delegasi shouldAutoRotate untuk memaksa orientasi aplikasi ke orientasi tertentu. Saya menggunakan potongan kode di bawah ini untuk memutar aplikasi ke orientasi yang diinginkan. Pertama, saya mengubah orientasi bilah status. Dan kemudian hanya menampilkan dan segera menolak tampilan modal memutar tampilan ke orientasi yang diinginkan.
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:vc animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];
Tapi ini gagal di iOS 8. Juga, saya telah melihat beberapa jawaban di stack overflow di mana orang menyarankan agar kita selalu menghindari pendekatan ini dari iOS 8 dan seterusnya.
Untuk lebih spesifik, aplikasi saya adalah tipe aplikasi universal. Ada tiga pengontrol secara total.
Pengontrol Tampilan Pertama - Ini harus mendukung semua orientasi di iPad dan hanya potret (tombol home down) di iPhone.
Pengontrol Tampilan Kedua - Seharusnya hanya mendukung lansekap tepat di semua kondisi
Pengontrol Tampilan Ketiga - Seharusnya hanya mendukung lanskap tepat di semua kondisi
Kami menggunakan pengontrol navigasi untuk navigasi halaman. Dari pengontrol tampilan pertama, pada aksi klik tombol, kami mendorong yang kedua pada stack. Jadi, ketika pengontrol tampilan kedua tiba, terlepas dari orientasi perangkat, aplikasi hanya akan mengunci lansekap.
Di bawah ini adalah saya shouldAutorotate
dan supportedInterfaceOrientations
metode di controller tampilan kedua dan ketiga.
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscapeRight;
}
-(BOOL)shouldAutorotate {
return NO;
}
Apakah ada solusi untuk ini atau cara yang lebih baik untuk mengunci view controller dalam orientasi tertentu untuk iOS 8. Tolong bantu !!
sumber
Jawaban:
Untuk iOS 7 - 10:
Tujuan-C:
Swift 3:
Sebut saja di
- viewDidAppear:
pengontrol tampilan yang disajikan.sumber
[UIView setAnimationsEnabled:NO];
dalamviewWillAppear
dan[UIView setAnimationsEnabled:YES];
diviewDidAppear
, terkait: stackoverflow.com/a/6292506/88597[UINavigationController attemptRotationToDeviceOrientation];
Rotasi orientasi sedikit lebih rumit jika Anda berada di dalam
UINavigationController
atauUITabBarController
. Masalahnya adalah bahwa jika pengendali tampilan tertanam di salah satu pengendali ini, pengendali navigasi atau tab bar akan diutamakan dan membuat keputusan tentang autorotation dan orientasi yang didukung.Saya menggunakan 2 ekstensi berikut pada UINavigationController dan UITabBarController sehingga melihat pengontrol yang tertanam di salah satu pengontrol ini bisa membuat keputusan.
Berikan View Controllers the Power!
Cepat 2.3
Cepat 3
Sekarang Anda dapat mengganti
supportedInterfaceOrientations
metode atau menimpashouldAutoRotate
di pengontrol tampilan yang ingin dikunci jika tidak, Anda dapat mengabaikan penggantian di pengontrol tampilan lain yang ingin Anda warisi perilaku orientasi default yang ditentukan dalam daftar aplikasi AndaNonaktifkan Rotasi
Kunci ke Orientasi Tertentu
Secara teori ini harus bekerja untuk semua hierarki pengendali tampilan yang kompleks, tapi saya perhatikan ada masalah dengan UITabBarController. Untuk beberapa alasan ia ingin menggunakan nilai orientasi default. Lihat posting blog berikut jika Anda tertarik mempelajari cara mengatasi beberapa masalah:
Kunci Rotasi Layar
sumber
Inilah yang bekerja untuk saya:
https://developer.apple.com/library//ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/clm/UIViewController/attemptRotationToDeviceOrientation
Sebut saja di metode viewDidAppear: Anda.
sumber
Saya menemukan bahwa jika itu adalah pengontrol tampilan yang disajikan, Anda dapat menimpanya
preferredInterfaceOrientationForPresentation
Cepat:
sumber
Cara ini cocok untuk saya di Swift 2 iOS 8.x:
PS (metode ini tidak perlu mengesampingkan fungsi orientasi seperti shouldautorotate pada setiap viewController, cukup satu metode di AppDelegate)
Periksa "memerlukan layar penuh" di info umum proyek Anda.
Jadi, di AppDelegate.swift buat variabel:
Jadi, letakkan juga func ini:
Jadi, di setiap kelas di proyek Anda, Anda dapat mengatur var ini di viewWillAppear:
Jika Anda perlu membuat pilihan berdasarkan jenis perangkat Anda dapat melakukan ini:
sumber
Pertama-tama - ini adalah ide yang buruk, secara umum, ada yang salah dengan arsitektur aplikasi Anda, tetapi
sh..t happens
, jika demikian, Anda dapat mencoba membuat sesuatu seperti di bawah ini:Dari pada
AppDelegate
Dan setiap kali Anda ingin mengubah orientasi lakukan sebagai:
Catatan: Terkadang, perangkat mungkin tidak diperbarui dari panggilan tersebut, jadi Anda mungkin perlu melakukan sebagai berikut
Itu saja
sumber
Ini harus bekerja dari iOS 6 ke atas, tetapi saya hanya mengujinya di iOS 8. Subkelas
UINavigationController
dan mengganti metode berikut:Atau tanyakan pengontrol tampilan yang terlihat
dan terapkan metode di sana.
sumber
Ini adalah umpan balik ke komentar dalam jawaban Sid Shah , mengenai cara menonaktifkan animasi menggunakan:
Kode:
sumber
Jika Anda menggunakan navigationViewController Anda harus membuat superclass Anda sendiri untuk ini dan menimpa:
ini akan menonaktifkan rotasi di SecondViewController tetapi jika Anda mendorong SecondViewController Anda ketika perangkat Anda pada orientasi potret maka Anda SecondViewController akan muncul dalam mode potret.
Asumsikan bahwa Anda menggunakan storyboard. Anda harus membuat segmen manual ( Cara ) dan dalam metode "onClick" Anda:
Ini akan memaksa orientasi lanskap sebelum fitur superclass Anda menonaktifkan autorotate.
sumber
Pada
Xcode 8
metode dikonversi ke properti, jadi berikut ini berfungsi denganSwift
:sumber
portrait
mode tidak peduli apa orientasi di iPad, denganshouldAutorotate
mengembalikan benar saya mencapai itu.Saya telah mencoba banyak solusi, tetapi yang berhasil adalah sebagai berikut:
Tidak perlu mengedit
info.plist
di ios 8 dan 9.Kemungkinan orientasi dari Dokumentasi Apple :
sumber
Kombinasi jawaban Sids dan Koreys bekerja untuk saya.
Memperluas Pengendali Navigasi:
Kemudian nonaktifkan rotasi pada Tampilan tunggal
Dan berputar ke orientasi yang sesuai sebelum segue
sumber
Solusi teratas di atas:
tidak bekerja untuk saya ketika saya menyebutnya di viewDidAppear dari pengontrol tampilan yang disajikan. Namun itu berhasil ketika saya memanggilnya di preparForSegue di controller tampilan presentasi.
(Maaf, reputasi poin tidak cukup untuk mengomentari solusi itu, jadi saya harus menambahkannya seperti ini)
sumber
[iOS9 +] Jika ada yang menyeret ke sini karena tidak ada solusi di atas yang berfungsi, dan jika Anda menyajikan tampilan yang ingin Anda ubah orientasi dengan segue, Anda mungkin ingin memeriksanya.
Periksa jenis presentasi segue Anda. Milik saya 'atas konteks saat ini'. Ketika saya mengubahnya ke Layar Penuh, itu berhasil.
Terima kasih kepada @GabLeRoux, saya menemukan solusi ini.
sumber
Persyaratan saya adalah
AVPlayerViewController
untuk memutar videoSaat video diputar, jika berupa lanskap maka izinkan layar untuk memutar lanskap ke kanan dan kiri lanskap. Jika itu potret maka kunci tampilan dalam mode potret saja.
Pertama, tentukan
supportedInterfaceOrientationsForWindow
diAppDelegate.swift
Kedua, di pengontrol tampilan utama Anda, tentukan fungsi berikut
Kemudian, Anda perlu subkelas
AVPlayerViewController
Timpa ketiga fungsi ini di
MyPlayerViewController.swift
Karena pengguna mungkin memutar lansekap perangkat ke kiri atau lansiran kanan, kita perlu mengatur rotasi otomatis menjadi true
Akhirnya, buat
MyPlayerViewController
instance di pengontrol tampilan Anda dan atur nilai ukuran properti.Inisiasi pemain Anda dengan benar
videoUrl
, lalu tetapkan pemain Anda keplayerViewController
. Selamat coding!sumber
sumber
Tampaknya masih ada beberapa perdebatan tentang cara terbaik untuk menyelesaikan tugas ini, jadi saya pikir saya akan berbagi pendekatan (bekerja) saya. Tambahkan kode berikut dalam
UIViewController
implementasi Anda :Untuk contoh ini, Anda juga perlu mengatur orientasi perangkat yang diizinkan ke 'Landscape Left' di pengaturan proyek Anda (atau langsung masuk
info.plist
). Ubah saja orientasi spesifik yang ingin Anda paksakan jika Anda menginginkan sesuatu selainLandscapeLeft.
Kuncinya bagi saya adalah
attemptRotationToDeviceOrientation
panggilan masukviewWillAppear
- tanpa itu tampilan tidak akan berputar dengan baik tanpa memutar perangkat secara fisik.sumber
Berdasarkan jawaban Korey Hinton
Swift 2.2:
Nonaktifkan Rotasi
Kunci ke Orientasi Tertentu
sumber
Saya mencoba beberapa solusi di sini dan yang penting untuk dipahami adalah pengontrol tampilan akar yang akan menentukan apakah akan diputar atau tidak.
Saya buat berikut tujuan-c proyek github.com/GabLeRoux/RotationLockInTabbedViewChild dengan contoh kerja dari
TabbedViewController
mana satu tampilan anak diperbolehkan berputar dan pandangan anak lainnya terkunci dalam potret.Ini tidak sempurna tetapi berfungsi dan ide yang sama harus bekerja untuk jenis tampilan root lainnya seperti
NavigationViewController
. :)sumber
Menurut solusi yang ditunjukkan oleh @ sid-sha Anda harus meletakkan semuanya dalam
viewDidAppear:
metode, jika tidak, Anda tidak akandidRotateFromInterfaceOrientation:
dipecat, jadi sesuatu seperti:sumber
Solusi saya
Di
AppDelegate
:XXViewController
adalah ViewController yang ingin Anda dukung mode Lansekap.Maka solusi Sunny Shah akan bekerja di Anda
XXViewController
pada versi iOS apa pun:Ini adalah fungsi utilitas untuk menemukan ViewController paling atas.
sumber
Gunakan ini untuk mengunci orientasi pengontrol tampilan, yang diuji pada iOS 9:
// Kunci orientasi ke kanan lansekap
sumber
Saya memiliki masalah yang sama dan menghabiskan banyak waktu untuk itu. Jadi sekarang saya punya solusi. Pengaturan aplikasi saya hanya mendukung potret saja. Namun, beberapa layar ke dalam aplikasi saya perlu hanya lanskap. Saya memperbaikinya dengan memiliki variabel isShouldRotate at AppDelegate . Dan fungsi di AppDelegate :
Dan akhirnya ketika ViewControllerA membutuhkan kondisi lansekap. Lakukan saja: sebelum push / present ke ViewController, tetapkan isShouldRotate ke true . Jangan lupa ketika pop / abaikan bahwa assign controller isShouldRotate ke false di viewWillDisappear .
sumber
Bagi saya, VC tingkat atas diperlukan untuk mengimplementasikan orientasi yang ditimpa. Menggunakan VC di tumpukan tidak akan berpengaruh jika VC atas tidak menerapkan.
Hanya VC-Main yang didengarkan, pada dasarnya dalam pengujian saya.
sumber
Sepertinya bahkan kamu di sini begitu banyak jawaban tidak ada yang cukup untukku. Saya ingin memaksakan orientasi dan kemudian kembali kembali ke orientasi perangkat tetapi
[UIViewController attemptRotationToDeviceOrientation];
tidak berhasil. Yang juga rumit adalah saya menambahkan shouldAutorotate ke false berdasarkan beberapa jawaban dan tidak bisa mendapatkan efek yang diinginkan untuk memutar kembali dengan benar di semua skenario.Jadi ini yang saya lakukan:
Sebelum mendorong controller dalam panggilan di init konstruktornya ini:
Jadi saya menyimpan orientasi perangkat terakhir dan mendaftar untuk acara perubahan orientasi. Acara perubahan orientasi sederhana:
Dan pada pandangan dissmising saya hanya memaksa kembali ke orientasi yang saya miliki sebagai userOreintation:
Dan ini juga harus ada di sana:
Dan juga pengendali navigasi harus mendelegasikan ke shouldAutorotate dan didukungInterfaceOrientations, tetapi kebanyakan orang sudah memiliki saya percaya.
PS: Maaf saya menggunakan beberapa ekstensi dan kelas dasar tetapi nama cukup berarti sehingga konsep dapat dimengerti, akan membuat lebih banyak ekstensi karena itu tidak terlalu cantik sekarang.
sumber