Saya memiliki aplikasi iPhone yang menggunakan UINavigationController
untuk menampilkan antarmuka lihat perincian: Pertama satu tampilan, lalu tampilan lainnya, hingga empat tingkat. Saya ingin tiga tampilan pertama dibatasi pada orientasi potret dan hanya tampilan terakhir yang diperbolehkan untuk memutar ke lanskap. Saat kembali dari tampilan keempat ke tampilan ketiga dan keempat dalam orientasi lanskap, saya ingin semuanya berputar kembali ke potret.
Di iOS 5 saya cukup menentukan shouldAutorotateToInterfaceOrientation:
di setiap pengontrol tampilan saya untuk mengembalikan YA untuk orientasi yang diizinkan. Semuanya bekerja seperti yang dijelaskan di atas, termasuk kembali ke potret meskipun perangkat sedang dipegang dalam orientasi lanskap saat kembali dari pengontrol tampilan # 4 ke # 3.
Di iOS 6 semua pengontrol tampilan berputar ke lanskap, melanggar yang tidak dimaksudkan. Catatan rilis iOS 6 mengatakan
Tanggung jawab lebih besar berpindah ke aplikasi dan delegasi aplikasi. Sekarang, penampung iOS (seperti
UINavigationController
) tidak berkonsultasi dengan anaknya untuk menentukan apakah mereka harus melakukan rotasi otomatis. [...] Sistem meminta pengontrol tampilan layar penuh paling atas (biasanya pengontrol tampilan root) untuk orientasi antarmuka yang didukung setiap kali perangkat berputar atau setiap kali pengontrol tampilan disajikan dengan gaya presentasi modal layar penuh. Selain itu, orientasi yang didukung diambil hanya jika pengontrol tampilan ini mengembalikan YA darishouldAutorotate
metodenya. [...] Sistem menentukan apakah suatu orientasi didukung dengan memotong nilai yang dikembalikan oleh metode aplikasisupportedInterfaceOrientationsForWindow:
dengan nilai yang dikembalikan olehsupportedInterfaceOrientations
metode pengontrol layar penuh paling atas.
Jadi saya membuat subclass UINavigationController
, memberikan MainNavigationController
properti boolean saya landscapeOK
dan menggunakan ini untuk mengembalikan orientasi yang diizinkan masuk supportedInterfaceOrientations
. Kemudian di setiap viewWillAppear:
metode pengontrol tampilan saya, saya memiliki garis seperti ini
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
untuk memberi tahu saya MainNavigationController
perilaku yang diinginkan.
Inilah pertanyaannya: Jika saya sekarang menavigasi ke tampilan keempat saya dalam mode potret dan membalikkan telepon itu berputar ke lanskap. Sekarang saya menekan tombol kembali untuk kembali ke tampilan ketiga saya yang seharusnya hanya berfungsi potret. Tapi itu tidak berputar kembali. Bagaimana cara membuatnya melakukan itu?
Saya mencoba
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
dalam viewWillAppear
metode pengontrol tampilan ketiga saya, tetapi tidak melakukan apa-apa. Apakah ini metode yang salah untuk menelepon atau mungkin tempat yang salah untuk menyebutnya atau haruskah saya menerapkan semuanya dengan cara yang sama sekali berbeda?
sumber
Tambahkan CustomNavigationController
Ganti metode ini di dalamnya:
Sekarang tambahkan semua orientasi di plist
Dalam pengontrol tampilan, tambahkan hanya yang diperlukan:
metode ini menggantikan metode pengontrol navigasi
sumber
ViewController
dalam mode Potret dan yang sayaViewController
dalam mode Landscap & Potret. Saya juga memberikan dukungan di iOS 5.0 & iOS 6.0. Itu sebabnya saya bingung untuk bekerja, tetapi ini adalah solusi yang bagus. saya menambahkan CustomNavigationController di pengontrol tampilan root saya dan memberikan dukungan sesuai dengan kebutuhan saya. Sekali lagi terima kasih.Setelah melihat setiap jawaban dalam pertanyaan serupa yang tak terhitung jumlahnya di SO, tidak ada jawaban yang berhasil untuk saya, tetapi mereka memberi saya beberapa ide. Begini cara saya menyelesaikan masalah:
Pertama, pastikan Orientasi Antarmuka yang Didukung di target proyek Anda berisi semua orientasi yang Anda inginkan untuk tampilan berputar Anda.
Selanjutnya, buat kategori
UINavigationController
(karena Apple mengatakan untuk tidak membuat subkelasnya):Impor kategori itu dan pengontrol tampilan yang ingin Anda putar (yang akan saya panggil
RotatingViewController
) ke pengontrol tampilan tingkat tertinggi Anda, yang seharusnya berisi pengontrol navigasi Anda. Dalam pengontrol tampilan tersebut, implementasikanshouldAutorotate
sebagai berikut. Perhatikan bahwa ini tidak boleh sama dengan pengontrol tampilan yang ingin Anda putar.Terakhir, di Anda
RotatingViewController
, terapkanshouldAutorotate
dansupportedInterfaceOrientations
sebagai berikut:Alasan Anda perlu melakukan ini adalah karena iOS 6 memberikan kontrol rotasi ke pengontrol tampilan root, bukan pengontrol tampilan atas. Jika Anda ingin rotasi tampilan individu berperilaku berbeda dari tampilan lain dalam tumpukan, Anda perlu menulis kasus khusus untuk itu di pengontrol tampilan root.
sumber
Reputasi saya tidak cukup untuk mengomentari jawaban @ Brian, jadi saya akan menambahkan catatan saya di sini.
Brian menyebutkan bahwa iOS6 memberikan kontrol rotasi ke rootViewController - ini tidak hanya dapat berupa UINavigationController seperti yang disebutkan tetapi juga UITabBarController, yang cocok untuk saya. Struktur saya terlihat seperti ini:
Jadi saya menambahkan metode pertama di UITabBarController kustom, kemudian di UINavigationController kustom dan terakhir di UIViewController tertentu.
Contoh dari UITabBarController dan UINavigationController:
sumber
Saya ingin memberikan jawaban parsial untuk pertanyaan saya sendiri. Saya menemukan baris kode berikut, yang digunakan dalam
viewWillAppear
metode ketiga sayaUIViewController
, berfungsi:Tetapi saya tidak terlalu menyukai solusi ini. Ini menggunakan trik untuk menetapkan ke properti hanya-baca yang menurut dokumentasi Apple mewakili orientasi fisik perangkat. Ini seperti memberi tahu iPhone untuk melompat ke orientasi yang benar di tangan pengguna.
Saya sangat tergoda untuk meninggalkan ini di aplikasi saya karena ini berfungsi. Tetapi rasanya tidak benar, jadi saya ingin membiarkan pertanyaan itu terbuka untuk mendapatkan solusi yang bersih.
sumber
Ini saya gunakan untuk dukungan orientasi di ios 6.0
sumber
Karena ini adalah utas yang sangat dilihat. Saya pikir saya akan menambahkan apa yang saya yakini sebagai jawaban termudah. Ini berfungsi untuk ios8 dan yang lebih baru
dan
Itu dia. Nikmati!
Oh, dan ViewControllers saya tertanam dalam pengontrol navigasi, yang tidak perlu saya subkelas atau konfigurasikan dengan cara apa pun.
sumber
Ini mungkin tidak berhasil untuk semua orang, tetapi berhasil dengan baik untuk saya. Alih-alih menerapkan ...
di viewWillAppear di semua pengontrol saya, saya memutuskan untuk memusatkan proses ini di dalam subkelas UINavigationController saya dengan mengganti metode UINavigationControllerDelegate
navigationController:willShowViewController:animated:
Saya telah menemukan bahwa metode delegasi ini tidak dipanggil ketika mengeluarkan VC dari tumpukan navigasi. Ini bukan masalah bagi saya karena saya menangani fungsionalitas belakang dari dalam subkelas UINavigationController saya sehingga saya dapat mengatur tombol dan tindakan bilah navigasi yang tepat untuk VC tertentu seperti ini ...
Berikut adalah bagaimana
back
metode saya terlihat untuk menangani popping VC dari tumpukan dan untuk mengatur preferensi rotasi yang sesuai ...Jadi, seperti yang Anda lihat, pada dasarnya yang terjadi adalah pertama-tama saya menetapkan dua properti untuk saya ...
di
navigationController:willShowViewController:animated:
mana akan menentukan apa orientasi didukung berada dalam yang VC yang hendak disajikan. Saat memunculkan VC, metode "kembali" kustom saya dipanggil dan saya kemudian menyetel isLandscapeOK ke apa yang disimpan melalui nilai VCLandscapeOK sebelumnya.Seperti yang saya katakan, ini mungkin tidak berfungsi untuk semua orang, tetapi berfungsi dengan baik untuk saya dan saya tidak perlu khawatir tentang menambahkan kode ke setiap pengontrol tampilan saya, saya dapat menjaga semuanya terpusat di subkelas UINavigationController.
Semoga ini membantu seseorang seperti yang saya lakukan. Terima kasih, Jeremy.
sumber
Buka file Info.plist Anda dan lakukan perubahan
sumber
Anda ingin Memaksa potret aplikasi iOS 6 saja, lalu Anda dapat menambahkan metode subkelas UIViewController di bawah ini
sumber
NSUInteger
akan menampilkan peringatan meskipun itu adalah tipe var yang benar. jika Anda memiliki penggunaan OCDUIInterfaceOrientationMask
sebagai gantinya.Saya ingin semua VC saya terkunci pada orientasi potret kecuali satu. Inilah yang berhasil bagi saya.
Di root controller tampilan, mendeteksi jenis thats controller tampilan di atas jendela dan mengatur orientasi aplikasi yang sesuai di supportedInterfaceOrientations metode. Misalnya, saya membutuhkan aplikasi saya untuk berputar hanya ketika tampilan web berada di atas tumpukan. Inilah yang saya tambahkan di rootVC saya:
sumber
[[Utils getAppDelegate] appNavigationController]
. Utilitas Saya menduga adalah beberapa kelas yang Anda miliki tetapi saya bingung apa yang Anda lakukan di dalamnya. Bantuan apa pun akan sangat bagus!Reputasi saya tidak cukup untuk menjawab pertanyaan @Ram S di bawah balasan @micmdk, jadi saya akan menambahkan catatan saya di sini.
Saat Anda menggunakan UITabbarController , coba ubah self.viewControllers.lastObject dalam kode @ micmdk menjadi self.selectedViewController seperti ini:
sumber
Anda bisa mengimplementasikan dan mengganti shouldAutorotate () dan supportInterfaceOrientations var di semua kelas View Controller Anda yang harus disajikan dalam orientasi berbeda dari yang ditentukan dalam PLIST aplikasi Anda.
Namun, dalam Antarmuka Pengguna nontrivial Anda mungkin menghadapi masalah untuk menambahkannya dalam lusinan kelas dan Anda tidak ingin membuat semuanya menjadi subkelas dari beberapa umum yang mendukungnya (MyBaseTableViewController, MyBaseNavigationController dan MyBaseTabBarController).
Karena Anda tidak dapat mengganti metode / var tersebut di UIViewController secara langsung, Anda dapat melakukannya pada subkelasnya yang biasanya merupakan kelas dasar Anda seperti UITableViewController, UINavigationController, dan UITabBarController.
Jadi, Anda dapat menerapkan beberapa ekstensi dan tetap menyiapkan MyPreciousViewController untuk ditampilkan dalam orientasi yang berbeda dari yang lain seperti cuplikan kode Swift 4 ini:
sumber
Saya telah memecahkan masalah yang sama.
Jika Anda menggunakan
UINavigationController
untuk mendorong pengontrol tampilan, Anda harus menyetel metode di bawah ini.Di tempat
LoginViewController
penggunaan yangUIViewController
ingin Anda tunjukkan. Dalam kasus saya, saya ingin menunjukkanLoginViewController
dalamPortrait
mode lainnyaViewControllers
dalamlandscape
mode.sumber
Silakan gunakan metode berikut untuk menyelesaikan masalah ini
kembalikan hanya orientasi yang Anda inginkan !!!
sumber