Aplikasi iPhone dalam mode lansekap, sistem 2008

98

Harap dicatat bahwa pertanyaan ini dari tahun 2008 dan sekarang hanya memiliki kepentingan sejarah.


Apa cara terbaik untuk membuat aplikasi iPhone yang berjalan dalam mode lanskap sejak awal, terlepas dari posisi perangkatnya?

Baik secara terprogram dan menggunakan Interface Builder.

Michiel de Mare
sumber
5
Untuk pembaca yang akan datang, harap dicatat bahwa masalah terkenal ini sekarang DIATASI oleh Apple pada tahun 2011. Perhatikan proyek uji dalam jawaban di bawah ini.
Fattie

Jawaban:

47

Jawaban historis saja. Sangat ketinggalan zaman.

Harap dicatat bahwa jawaban ini sekarang sangat ketinggalan zaman /

Jawaban ini hanyalah keingintahuan sejarah .


Berita menarik! Seperti yang ditemukan oleh Andrew di bawah, masalah ini telah diperbaiki oleh Apple di versi 4.0+.

Tampaknya tidak perlu lagi memaksakan ukuran tampilan pada setiap tampilan, dan masalah serius khusus lanskap "baru berfungsi pertama kali" telah diselesaikan.

Pada April 2011, tidak mungkin untuk menguji atau bahkan membangun apa pun di bawah 4.0, jadi pertanyaannya hanyalah keingintahuan bersejarah. Sungguh luar biasa betapa banyak masalah yang ditimbulkannya bagi para pengembang begitu lama!


Berikut adalah pembahasan dan solusi asli. Ini sama sekali tidak relevan sekarang, karena sistem ini bahkan tidak dapat dioperasikan.


SANGAT SULIT untuk membuat ini berfungsi sepenuhnya - setidaknya ada tiga masalah / bug yang sedang dimainkan.

coba ini .. desain lansekap pembangun antarmuka

Perhatikan khususnya di mana dikatakan "dan Anda perlu menggunakan shouldAutorotateToInterfaceOrientation dengan benar di mana pun" artinya di mana saja, semua tampilan layar penuh Anda.

Semoga membantu dalam mimpi buruk ini!

Sebuah pengingat penting dari masalah TAMBAHAN terkenal yang dihadapi di sini: jika Anda mencoba untuk beralih antara LEBIH DARI SATU tampilan (semua lanskap), INI HANYA TIDAK BEKERJA . Sangat penting untuk mengingat ini atau Anda akan membuang hari untuk masalah tersebut. Secara harfiah TIDAK MUNGKIN. Ini adalah bug terbuka, yang diketahui, terbesar di platform iOS. Secara harfiah tidak ada cara untuk membuat perangkat keras membuat tampilan kedua yang Anda muat, menjadi lanskap. Solusi yang menjengkelkan tetapi sederhana, dan yang harus Anda lakukan, adalah memiliki master UIViewController sepele yang tidak melakukan apa pun selain duduk di sana dan membiarkan Anda bertukar di antara tampilan Anda.

Dengan kata lain, di iOS karena bug utama yang diketahui:

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

Anda hanya dapat melakukannya sekali . Nanti, jika Anda mencoba untuk menghapus happyThing.view, dan bukannya meletakkan newThing.view di sana, ITU TIDAK BEKERJA - DAN ITU ITU. Mesin tidak akan pernah memutar tampilan menjadi lanskap. Tidak ada perbaikan trik, bahkan Apple tidak dapat membuatnya bekerja. Solusi yang harus Anda adopsi adalah memiliki UIViewController secara keseluruhan yang hanya ada di sana dan hanya menyimpan berbagai tampilan Anda (happyThing, newThing, dll). Semoga membantu!

Gendut
sumber
2
Saya yakin ini telah diperbaiki di 4.x. Kami mengirimkan game yang memiliki banyak layar berbeda, beberapa lanskap dan beberapa potret, dan itu tidak berfungsi di 3.x. Karena tidak ingin menggunakan tampilan dummy ekstra untuk menanganinya, kami malah meminta 4.x - yang, setahun setelah pertanyaan ini diajukan, mungkin OKE.
AndrewS
Kami tidak melakukan "selalu lanskap" melainkan berbagai lanskap atau potret. Setiap VC langsung ditambahkan dan dihapus dari jendela. Aplikasi meluncurkan lanskap, tetap seperti itu melalui beberapa transisi layar. Kami tidak menggunakan tampilan dummy, tetapi kami MELAKUKAN mengganti shouldAutorotate di setiap layar. Tidak ada masalah di 4.x, dari touch to pad hingga phone.
AndrewS
41

Dari Situs Dev Apple:

Untuk memulai aplikasi Anda dalam mode lanskap sehingga bilah status berada di posisi yang tepat dengan segera, edit file Info.plist Anda untuk menambahkan kunci UIInterfaceOrientation dengan nilai yang sesuai (UIInterfaceOrientationLandscapeRight atau UIInterfaceOrientationLandscapeLeft), seperti yang ditunjukkan pada Listing 2.

Kode 2: Memulai aplikasi Anda dalam mode lanskap

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
Michael Pryor
sumber
5
Ini plus dalam metode shouldAutorotateToInterfaceOrientation Anda return (interfaceOrientation! = UIInterfaceOrientationPortrait); dan Anda selesai.
Michael Behan
5
Pertanyaan menanyakan bagaimana memulai perangkat dalam mode lansekap. Jawabannya memberikan informasi itu. Orientasi penanganan setelah itu tidak disebutkan dalam pertanyaan. +1 Michael Pryor
ingh.am
1
Menariknya, "jawaban" sebenarnya TIDAK akan memulai perangkat dalam mode lanskap - !! Ini mungkin satu-satunya bug / kesulitan paling terkenal di seluruh lingkungan Apple. Ini dasar untuk pengembang iPad yang sangat bekerja!
Fattie
@mbehan Ada juga UIInterfaceOrientationPortraitUpsideDown, jadi bukan perbaikan. Selain itu, UIInterfaceOrientation dalam .plist hanya didukung di 3.2+, bukan di perangkat 3.1.3 dan yang lebih lama (dan ingat iPhone 2G macet di versi itu).
Ivan Vučica
28

Ringkasan dan integrasi dari semua posting, setelah mengujinya sendiri; periksa pembaruan untuk 4.x, 5.x di bawah ini.

Mulai 3.2 Anda tidak dapat mengubah orientasi aplikasi yang sedang berjalan dari kode.

Tetapi Anda dapat memulai aplikasi dengan orientasi tetap, meskipun melakukannya tidak langsung.

Coba dengan resep ini:

  1. atur orientasi Anda ke UISupportedInterfaceOrientationsdalam Info.plistfile
  2. di jendela Anda, tentukan "pengontrol tampilan dasar" 480x320. Setiap tampilan lainnya akan ditambahkan sebagai subview dari tampilan tersebut.
  3. di semua pengontrol tampilan menyiapkan shouldAutorotateToInterfaceOrientation:metode (untuk mengembalikan nilai yang sama yang Anda tentukan di plist, tentu saja)
  4. di semua pengontrol tampilan mengatur tampilan latar belakang dengan

    self.view.frame = CGRectMake(0, 0, 480, 320)

    dalam viewDidLoadmetode.

Pembaruan (iOS 4.x, 5.x) : Panduan Pemrograman Aplikasi Apple iOS memiliki paragraf "Peluncuran dalam Mode Lansekap" di bab "Trik Aplikasi Tingkat Lanjut".

Referensi:

IlDan
sumber
1
Saya dapat mengonfirmasi bahwa ini adalah satu-satunya solusi yang benar-benar berfungsi (dengan sedikit tambahan). Saya butuh waktu berjam-jam untuk menemukan dan mengevaluasinya. Semua jawaban lain hanyalah sebagian dari solusi untuk masalah tersebut.
Johannes Rudolph
8

Pertama saya setel di info.plist

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

lalu saya meletakkan kode ini di applicationDidFinishLaunching:

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
[window setTransform:rotate];

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

Dengan cara ini saya dapat mengerjakan tampilan di Interface Builder dalam mode lanskap.

samvermette
sumber
7

Jawaban sasb dan michaelpryor tampaknya benar, tetapi jika tidak berhasil untuk Anda, coba alternatif ini:

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

Atau yang ini:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Atau yang ini:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

Anda mungkin juga harus menelepon window makeKeyAndVisible; dulu.

Beberapa tautan: Berkembang dalam mode lanskap , SDK iPhone: Bagaimana cara memaksa mode Lansekap saja?

@Robert: lihat The iPhone SDK, NDA, dan Stack Overflow .

Sören Kuklau
sumber
6

Saya terkejut belum ada yang memberikan jawaban ini:

Dalam semua pengujian saya ketika menutup pengontrol tampilan modal, orientasi pilihan pengontrol tampilan induk yang ditetapkan di shouldAutorotateToInterfaceOrientationdihormati bahkan ketika bagian dari UINavigationController. Jadi solusi untuk ini sederhana:

Buat UIViewController tiruan dengan UIImageView sebagai latar belakang. Setel gambar ke gambar default.png yang digunakan aplikasi Anda saat memulai.

Ketika viewWillAppeardipanggil di pengontrol tampilan root Anda, cukup tunjukkan pengontrol tampilan tiruan tanpa animasi.

ketika viewDidAppeardipanggil dalam pengontrol tampilan dummy Anda, tutup pengontrol tampilan dengan animasi silang larut yang bagus.

Ini tidak hanya berfungsi, tetapi juga terlihat bagus! BTW, hanya untuk klarifikasi saya melakukan pengontrol tampilan root viewWillAppearseperti ini:

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}
Arlen Anderson
sumber
5

Panduan Pemrograman iPhone OS terbaru memiliki bagian lengkap tentang ini, dengan kode contoh. Saya yakin ini adalah tambahan baru-baru ini, jadi mungkin Anda melewatkannya. Ini menjelaskan semua kondisi yang harus Anda patuhi; pada dasarnya ...

  • mengatur properti Info.plist (ini mengubah posisi bilah status, tetapi tidak tampilan)
  • putar tampilan Anda secara manual di sekitar tengahnya, baik pada metode UIViewController viewDidLoad: atau metode applicationDidFinishLaunching: atau implementasikan rotasi otomatis ("Autoresizing behaviors", halaman 124)

Cari "Launching in Landscape Mode", halaman 102.


sumber
4

Lihat jawaban ini: Mode Lansekap HANYA untuk iPhone atau iPad

  1. tambahkan orientasi ke plist
  2. shouldAutorotateToInterfaceOrientation = YES di semua file

Meskipun jika Anda menggunakan mode campuran, Anda mungkin lebih baik menggunakan

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
nicc
sumber