Saya memiliki aplikasi di mana saya ingin mendukung rotasi perangkat dalam tampilan tertentu tetapi yang lain tidak terlalu masuk akal dalam mode Lansekap, jadi saat saya menukar tampilan, saya ingin memaksa rotasi diatur ke potret.
Ada penyetel properti tidak berdokumen di UIDevice yang melakukan trik tersebut tetapi jelas menghasilkan peringatan compiler dan bisa menghilang dengan revisi SDK di masa mendatang.
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
Apakah ada cara terdokumentasi untuk memaksa orientasi?
Pembaruan: Saya pikir saya akan memberikan contoh karena saya tidak mencari shouldAutorotateToInterfaceOrientation karena saya telah menerapkannya.
Saya ingin aplikasi saya mendukung lanskap dan potret di Tampilan 1 tetapi hanya potret di Tampilan 2. Saya telah mengimplementasikan shouldAutorotateToInterfaceOrientation untuk semua tampilan tetapi jika pengguna dalam mode lanskap di Tampilan 1 dan kemudian beralih ke Tampilan 2, saya ingin memaksa telepon untuk memutar kembali ke Potret.
sumber
Jawaban:
Ini tidak lagi menjadi masalah di iPhone 3.1.2 SDK yang lebih baru. Sekarang tampaknya menghormati orientasi yang diminta dari tampilan yang didorong kembali ke tumpukan. Itu mungkin berarti bahwa Anda perlu mendeteksi versi iPhone OS yang lebih lama dan hanya menerapkan setOrientation saat sebelum rilis terbaru.
Tidak jelas apakah analisis statis Apple akan memahami bahwa Anda sedang mengatasi batasan SDK yang lebih lama. Saya pribadi telah diberitahu oleh Apple untuk menghapus panggilan metode pada pembaruan saya berikutnya jadi saya belum yakin apakah peretasan untuk perangkat yang lebih lama akan melalui proses persetujuan.
sumber
Ini lama setelah fakta, tetapi untuk berjaga-jaga jika ada orang yang tidak menggunakan pengontrol navigasi dan / atau tidak ingin menggunakan metode yang tidak terdokumentasi:
Ini cukup untuk menampilkan dan menutup pengontrol tampilan vanilla.
Jelas Anda masih perlu mengonfirmasi atau menolak orientasi dalam penggantian shouldAutorotateToInterfaceOrientation Anda. Tapi ini akan menyebabkan shouldAutorotate ... dipanggil lagi oleh sistem.
sumber
Jika Anda ingin memaksanya untuk memutar dari potret ke lanskap di sini adalah kodenya. Perhatikan saja bahwa Anda perlu menyesuaikan bagian tengah tampilan Anda. Saya perhatikan saya tidak menempatkan pemandangan di tempat yang tepat. Jika tidak, itu bekerja dengan sempurna. Terima kasih atas tipnya.
sumber
CGAffineTransformMakeRotation
tampilan bisa diputar tetapi UIAlertView masih sesuai dengan orientasi bilah status yaitu, -degreeToRadian (sudut)? Apakah Anda mendapatkan sesuatu seperti ini?UIAlertView
adalah dengan menyetel pengontrol tampilan Anda sebagai delegasi alertView lalu di:,- (void) didPresentAlertView:(UIAlertView *) alertView
Anda melakukan rotasi berdasarkan arus[UIApplication sharedApplication].statusBarOrientation
. Jika Anda tidak menganimasikannya, seharusnya tidak terlihat terlalu aneh.Dari apa yang saya tahu, file
setOrientation:
metode ini tidak berfungsi (atau mungkin tidak berfungsi lagi). Inilah yang saya lakukan untuk melakukan ini:pertama, letakkan definisi ini di bagian atas file Anda, tepat di bawah #imports Anda:
kemudian, dalam
viewWillAppear:
metodejika Anda ingin itu menjadi animasi, maka Anda dapat membungkus semuanya dalam blok animasi, seperti:
Kemudian, di pengontrol mode potret Anda, Anda dapat melakukan pembalikan - periksa untuk melihat apakah saat ini dalam lanskap, dan jika demikian, putar kembali ke Potret.
sumber
Saya mengalami masalah di mana saya memiliki
UIViewController
layar, dalamUINavigationController
, dalam orientasi lanskap. Namun, ketika pengontrol tampilan berikutnya didorong ke dalam aliran, saya memerlukan perangkat untuk kembali ke orientasi potret.Apa yang saya perhatikan, adalah bahwa
shouldAutorotateToInterfaceOrientation:
metode ini tidak dipanggil ketika pengontrol tampilan baru didorong ke tumpukan, tetapi dipanggil ketika pengontrol tampilan muncul dari tumpukan .Memanfaatkan ini, saya menggunakan cuplikan kode ini di salah satu aplikasi saya:
Pada dasarnya, dengan membuat pengontrol tampilan kosong, mendorongnya ke tumpukan, dan segera mengeluarkannya, dimungkinkan untuk membuat antarmuka kembali ke posisi potret. Setelah pengontrol dimunculkan, saya hanya mendorong pengontrol yang ingin saya dorong terlebih dahulu. Secara visual, ini tampak hebat - pengontrol tampilan yang kosong dan sewenang-wenang tidak pernah dilihat oleh pengguna.
sumber
Ada cara sederhana untuk memaksa iPhone secara terprogram ke orientasi yang diperlukan - menggunakan dua jawaban yang sudah disediakan oleh kdbdallas , Josh :
bekerja seperti pesona :)
EDIT:
untuk iOS 6 saya perlu menambahkan fungsi ini: (bekerja pada modal viewcontroller)
sumber
Saya telah menggali dan menggali mencari solusi yang baik untuk ini. Menemukan entri blog ini yang melakukan trik: hapus tampilan terluar Anda dari kunci
UIWindow
dan tambahkan lagi, sistem kemudian akan melakukan kueri ulangshouldAutorotateToInterfaceOrientation:
metode dari pengontrol tampilan Anda, memaksakan orientasi yang benar untuk diterapkan. Lihat: iphone memaksa UI untuk mengubah orientasisumber
Jawaban Josh bekerja dengan baik untukku.
Namun, saya lebih suka memposting pemberitahuan "orientasi memang berubah, perbarui UI" . Saat notifikasi ini diterima oleh pengontrol tampilan, ia memanggil
shouldAutorotateToInterfaceOrientation:
, memungkinkan Anda menyetel orientasi apa pun dengan kembaliYES
ke orientasi yang Anda inginkan.Satu-satunya masalah adalah ini memaksa orientasi ulang tanpa animasi. Anda perlu membungkus garis ini antara
beginAnimations:
dancommitAnimations
untuk mencapai transisi yang mulus.Semoga membantu.
sumber
FWIW, inilah implementasi saya untuk mengatur orientasi secara manual (untuk masuk ke pengontrol tampilan root aplikasi Anda, natch):
digabungkan dengan
UINavigationControllerDelegate
metode berikut (dengan asumsi Anda menggunakan aUINavigationController
):Itu menangani pemutaran tampilan root sesuai dengan apakah yang masuk
UIViewController
mendukung orientasi perangkat saat ini. Akhirnya, Anda ingin menghubungkanrotateInterfaceToOrientation
ke perubahan orientasi perangkat yang sebenarnya untuk meniru fungsionalitas iOS standar. Tambahkan event handler ini ke pengontrol tampilan root yang sama:Terakhir, daftar untuk
UIDeviceOrientationDidChangeNotification
notifikasi diinit
atauloadview
seperti ini:sumber
shouldAutorotate
metode baru (lihat stackoverflow.com/a/12586002/5171 ).Ini berhasil untuk saya (terima kasih Henry Cooke):
Tujuan saya adalah untuk menangani perubahan orientasi lanskap saja.
metode init:
sumber
Saya menyadari bahwa posting asli di atas di utas ini sudah sangat tua sekarang, tetapi saya memiliki masalah yang sama - yaitu. semua layar di Aplikasi saya hanya potret, dengan pengecualian satu layar, yang dapat diputar antara lanskap dan potret oleh pengguna.
Ini cukup mudah, tetapi seperti posting lainnya, saya ingin Aplikasi secara otomatis kembali ke potret terlepas dari orientasi perangkat saat ini, ketika kembali ke layar sebelumnya.
Solusi yang saya terapkan adalah menyembunyikan Bilah Navigasi saat dalam mode lanskap, yang berarti bahwa pengguna hanya dapat kembali ke layar sebelumnya saat dalam mode potret. Oleh karena itu, semua layar lainnya hanya dapat dalam mode potret.
Ini juga memiliki manfaat tambahan untuk Aplikasi saya karena ada lebih banyak ruang layar yang tersedia dalam mode lanskap. Ini berguna karena layar yang dimaksud digunakan untuk menampilkan file PDF.
Semoga ini membantu.
sumber
Saya menyelesaikan ini dengan cukup mudah pada akhirnya. Saya mencoba setiap saran di atas dan masih gagal, jadi inilah solusi saya:
Di ViewController yang perlu tetap Landscape (Kiri atau Kanan), saya mendengarkan perubahan orientasi:
Kemudian di didRotate:
Ingatlah setiap Super Views / Subviews yang menggunakan autoresizing, karena view.bounds / frame sedang disetel ulang secara eksplisit ...
Satu-satunya peringatan untuk metode ini untuk mempertahankan tampilan Lansekap, adalah animasi yang melekat yang beralih di antara orientasi yang harus terjadi, ketika akan lebih baik untuk membuatnya tampak tidak ada perubahan.
sumber
Solusi iOS 6:
Kode tepatnya tergantung per aplikasi dan juga di mana Anda meletakkannya (saya menggunakannya di AppDelegate saya). Gantikan
[[self window] rootViewController]
dengan apa yang Anda gunakan. Saya menggunakan fileUITabBarController
.sumber
Saya menemukan solusi dan menulis sesuatu dalam bahasa Prancis (tetapi kode dalam bahasa Inggris). sini
Caranya adalah dengan menambahkan pengontrol ke tampilan jendela (pengontrol harus memiliki implementasi yang baik dari fungsi shouldRotate ....).
sumber
Jika Anda menggunakan UIViewControllers, ada metode ini:
Kembali
NO
untuk pengontrol tampilan yang berisi tampilan yang tidak ingin Anda putar.Info selengkapnya di sini
sumber
Saya tidak berpikir ini mungkin dilakukan pada saat run-time, meskipun Anda tentu saja dapat menerapkan transformasi 90 derajat ke UI Anda.
sumber
Ini yang saya gunakan. (Anda mendapatkan beberapa peringatan kompilasi tetapi berfungsi baik di Simulator dan iPhone)
sumber