แอพ iPhone ในโหมดแนวนอนระบบ 2008


98

โปรดทราบว่าคำถามนี้มาจากปี 2008 และตอนนี้เป็นเพียงความสนใจในประวัติศาสตร์เท่านั้น


วิธีใดดีที่สุดในการสร้างแอปพลิเคชัน iPhone ที่ทำงานในโหมดแนวนอนตั้งแต่เริ่มต้นโดยไม่คำนึงถึงตำแหน่งของอุปกรณ์

ทั้งทางโปรแกรมและโดยใช้ตัวสร้างส่วนต่อประสาน


5
สำหรับผู้อ่านในอนาคตโปรดทราบว่าปัญหาที่มีชื่อเสียงนี้ได้รับการแก้ไขแล้วโดย Appleในปี 2011 โปรดสังเกตโครงการทดสอบในคำตอบด้านล่าง
Fattie

คำตอบ:


47

คำตอบในอดีตเท่านั้น ล้าสมัยอย่างมาก

โปรดทราบว่าคำตอบนี้ล้าสมัยอย่างมาก /

คำตอบนี้เป็นเพียงความอยากรู้อยากเห็นทางประวัติศาสตร์เท่านั้น


ข่าวเด็ด! ดังที่ค้นพบโดย Andrew ด้านล่างปัญหานี้ได้รับการแก้ไขโดย Apple ใน 4.0+

ดูเหมือนว่าไม่จำเป็นต้องบังคับขนาดของมุมมองในทุกมุมมองอีกต่อไปและปัญหาร้ายแรงเฉพาะของแนวนอน "ใช้งานได้ในครั้งแรกเท่านั้น" ได้รับการแก้ไขแล้ว

เมื่อเดือนเมษายน 2554 ไม่สามารถทดสอบหรือสร้างอะไรที่ต่ำกว่า 4.0 ได้ดังนั้นคำถามจึงเป็นความอยากรู้อยากเห็นในอดีต เป็นเรื่องเหลือเชื่อที่สร้างปัญหาให้กับนักพัฒนามานานมาก


นี่คือการอภิปรายและวิธีแก้ปัญหาดั้งเดิม ตอนนี้ไม่เกี่ยวข้องอย่างยิ่งเนื่องจากระบบเหล่านี้ไม่สามารถใช้งานได้


มันยากมากที่จะทำให้งานนี้สมบูรณ์ - มีปัญหา / ข้อบกพร่องอย่างน้อยสามอย่างในการเล่น

ลองใช้ .. การออกแบบภูมิทัศน์ตัวสร้างอินเทอร์เฟซ

โดยเฉพาะอย่างยิ่งที่ระบุว่า"และคุณต้องใช้ shouldAutorotateToInterfaceOrientation อย่างถูกต้องทุกที่"หมายถึงทุกที่ทุกมุมมองแบบเต็มหน้าจอของคุณ

หวังว่ามันจะช่วยในฝันร้ายนี้!

การแจ้งเตือนที่สำคัญเกี่ยวกับปัญหาที่รู้จักกันดีเพิ่มเติมที่นี่: หากคุณกำลังพยายามสลับระหว่างมุมมองมากกว่าหนึ่งมุมมอง (แนวนอนทั้งหมด) มันไม่ง่ายเลย จำเป็นต้องจำสิ่งนี้ไว้มิฉะนั้นคุณจะเสียเวลาไปกับปัญหา แท้จริงมันเป็นไปไม่ได้ เป็นบั๊กแบบเปิดที่รู้จักกันมากที่สุดบนแพลตฟอร์ม iOS ไม่มีวิธีใดที่จะทำให้ฮาร์ดแวร์ทำให้มุมมองที่สองที่คุณโหลดเป็นแนวนอนได้ วิธีแก้ปัญหาที่น่ารำคาญ แต่เรียบง่ายและสิ่งที่คุณต้องทำคือมี UIViewController ต้นแบบที่ไม่สำคัญที่ไม่ทำอะไรเลยนอกจากนั่งที่นั่นและให้คุณสลับระหว่างมุมมองของคุณ

กล่าวอีกนัยหนึ่งใน iOS เนื่องจากข้อผิดพลาดที่สำคัญ:

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

คุณสามารถทำได้เพียงครั้งเดียว ในภายหลังหากคุณพยายามลบ happyThing.view และใส่ newThing.view ไว้ในนั้นแทนมันไม่ทำงาน - นั่นคือสิ่งนั้น เครื่องจะไม่หมุนมุมมองเป็นแนวนอน ไม่มีการแก้ไขเคล็ดลับแม้แต่ Apple ก็ไม่สามารถใช้งานได้ วิธีแก้ปัญหาที่คุณต้องนำมาใช้คือการมี UIViewController โดยรวมที่อยู่ตรงนั้นและเก็บมุมมองต่างๆของคุณไว้ (happyThing, newThing ฯลฯ ) หวังว่าจะช่วยได้!


2
ฉันเชื่อว่าสิ่งนี้ได้รับการแก้ไขแล้วใน 4.x. เราจัดส่งเกมที่มีหน้าจอที่แตกต่างกันออกไปแนวนอนและแนวตั้งบางส่วนและมันก็ใช้งานไม่ได้ใน 3.x ไม่ต้องการเข้าสู่มุมมองแบบจำลองพิเศษเพื่อจัดการกับมันเราต้องการ 4.x แทน - ซึ่งหนึ่งปีหลังจากคำถามนี้ถูกถามก็น่าจะโอเค
AndrewS

เราไม่ได้ทำ "แนวนอนเสมอ" แต่เป็นแนวนอนหรือแนวตั้งที่หลากหลาย VC แต่ละตัวจะถูกเพิ่มและลบออกจากหน้าต่างโดยตรง แอพเปิดตัวแนวนอนคงอยู่เช่นนั้นผ่านการเปลี่ยนหน้าจอต่างๆ เราไม่ได้ใช้มุมมองจำลอง แต่เราจะแทนที่ shouldAutorotate ในทุกหน้าจอ ไม่มีปัญหาใน 4.x ตั้งแต่ทัชแพดไปจนถึงโทรศัพท์
AndrewS

40

จากไซต์ Apple Dev:

ในการเริ่มแอปพลิเคชันของคุณในโหมดแนวนอนเพื่อให้แถบสถานะอยู่ในตำแหน่งที่เหมาะสมในทันทีให้แก้ไขไฟล์ Info.plist ของคุณเพื่อเพิ่มคีย์ UIInterfaceOrientation ด้วยค่าที่เหมาะสม (UIInterfaceOrientationLandscapeRight หรือ UIInterfaceOrientationLandscapeLeft) ดังแสดงในรายการที่ 2

รายการ 2: เริ่มแอปพลิเคชันของคุณในโหมดแนวนอน

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

5
สิ่งนี้บวกในเมธอด shouldAutorotateToInterfaceOrientation ของคุณกลับมา (interfaceOrientation! = UIInterfaceOrientationPortrait); และเสร็จแล้ว
Michael Behan

5
คำถามจะถามวิธีเริ่มอุปกรณ์ในโหมดแนวนอน คำตอบให้ข้อมูลดังกล่าว การวางแนวการจัดการหลังจากนั้นจะไม่กล่าวถึงในคำถาม 1 ไมเคิลไพรเออร์
ingh.am

1
"คำตอบ" ที่น่าทึ่งในความเป็นจริงจะไม่เริ่มต้นอุปกรณ์ในโหมดแนวนอน - !! อาจเป็นจุดบกพร่อง / ความยากที่มีชื่อเสียงที่สุดในสภาพแวดล้อมทั้งหมดของ Apple เป็นพื้นฐานสำหรับนักพัฒนา iPad ที่ใช้งานได้ดี!
Fattie

@mbehan นอกจากนี้ยังมี UIInterfaceOrientationPortraitUpsideDown จึงไม่ใช่การแก้ไข นอกจากนี้ UIInterfaceOrientation ใน. plist ยังรองรับเฉพาะบน 3.2+ เท่านั้นไม่ใช่บนอุปกรณ์ 3.1.3 และรุ่นเก่า (และจำไว้ว่า iPhone 2G ติดอยู่ในเวอร์ชันนั้น)
Ivan Vučica

28

สรุปและบูรณาการจากโพสต์ทั้งหมดหลังจากทดสอบด้วยตัวเอง ตรวจสอบการอัปเดตสำหรับ 4.x, 5.x ด้านล่าง

ณ 3.2 คุณไม่สามารถเปลี่ยนการวางแนวของแอปพลิเคชันที่กำลังทำงานอยู่จากรหัสได้

แต่คุณสามารถเริ่มแอปพลิเคชันด้วยการวางแนวคงที่ได้แม้ว่าการทำเช่นนี้จะไม่ตรงไปตรงมา

ลองใช้สูตรนี้:

  1. ตั้งค่าการวางแนวของคุณUISupportedInterfaceOrientationsในInfo.plistไฟล์
  2. ในหน้าต่างของคุณกำหนด "ตัวควบคุมมุมมองฐาน" 480x320 ทุกมุมมองอื่น ๆ จะถูกเพิ่มเป็นมุมมองย่อยในมุมมอง
  3. ในตัวควบคุมมุมมองทั้งหมดตั้งค่าshouldAutorotateToInterfaceOrientation:วิธีการ (เพื่อส่งคืนค่าเดียวกับที่คุณกำหนดไว้ใน plist แน่นอน)
  4. ในตัวควบคุมมุมมองทั้งหมดตั้งค่ามุมมองพื้นหลังด้วย

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

    ในviewDidLoadวิธีการ

อัปเดต (iOS 4.x, 5.x) : คู่มือการเขียนโปรแกรมแอป Apple iOS มีย่อหน้า "การเปิดตัวในโหมดแนวนอน" ในบท "เคล็ดลับแอปขั้นสูง"

อ้างอิง:


1
ฉันสามารถยืนยันได้ว่านี่เป็นโซลูชันเดียวที่ใช้งานได้จริง (โดยมีการเพิ่มเติมเล็กน้อย) ฉันใช้เวลาหลายชั่วโมงในการค้นหาและประเมินสิ่งนี้ คำตอบอื่น ๆ ทั้งหมดเป็นเพียงวิธีแก้ปัญหาบางส่วนเท่านั้น
Johannes Rudolph

8

ก่อนอื่นฉันตั้งค่าใน info.plist

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

จากนั้นฉันใส่รหัสนี้ใน 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)]; 

ด้วยวิธีนี้ฉันสามารถทำงานกับมุมมองในตัวสร้างอินเทอร์เฟซในโหมดแนวนอน


7

คำตอบของ sasb และ michaelpryor ดูเหมือนจะถูกต้อง แต่ถ้ามันไม่ได้ผลสำหรับคุณลองใช้ทางเลือกนี้:

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

หรืออันนี้:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

หรืออันนี้:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

คุณอาจต้องโทรหาwindow makeKeyAndVisible;ก่อน

ไม่กี่ลิงค์: การพัฒนาในโหมดแนวนอน , iPhone SDK: วิธีการบังคับโหมดแนวนอนเท่านั้น?

@ Robert: โปรดดูที่iPhone ที่ SDK, NDA และกองมากเกิน


6

ฉันแปลกใจที่ยังไม่มีใครให้คำตอบนี้:

ในการทดสอบทั้งหมดของฉันเมื่อปิดตัวควบคุมมุมมองแบบโมดอลการวางแนวที่ต้องการของตัวควบคุมมุมมองหลักshouldAutorotateToInterfaceOrientationจะได้รับเกียรติแม้ในขณะที่เป็นส่วนหนึ่งของ UINavigationController ดังนั้นวิธีแก้ปัญหานี้จึงง่ายมาก:

สร้าง UIViewController จำลองด้วย UIImageView สำหรับพื้นหลัง ตั้งค่าภาพเป็นภาพ default.png ที่แอปของคุณใช้เมื่อเริ่มต้น

เมื่อviewWillAppearถูกเรียกในตัวควบคุมมุมมองรูทของคุณเพียงแค่นำเสนอตัวควบคุมมุมมองจำลองโดยไม่มีภาพเคลื่อนไหว

เมื่อviewDidAppearถูกเรียกในตัวควบคุมมุมมองจำลองของคุณให้ปิดตัวควบคุมมุมมองด้วยภาพเคลื่อนไหวที่ละลายได้

งานนี้ไม่เพียง แต่ดูดี! BTW เพียงเพื่อความกระจ่างฉันใช้ตัวควบคุมมุมมองรูทเป็นviewWillAppearดังนี้:

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

5

คู่มือการเขียนโปรแกรม iPhone OS ล่าสุดมีเนื้อหาทั้งหมดพร้อมโค้ดตัวอย่าง ฉันแน่ใจว่านี่เป็นการเพิ่มล่าสุดดังนั้นบางทีคุณอาจพลาดไป อธิบายถึงเงื่อนไขทั้งหมดที่คุณต้องปฏิบัติตาม โดยพื้นฐาน ...

  • ตั้งค่าคุณสมบัติ Info.plist (ซึ่งจะเปลี่ยนตำแหน่งของแถบสถานะ แต่ไม่ใช่มุมมอง)
  • หมุนมุมมองของคุณรอบ ๆ จุดศูนย์กลางด้วยตนเองบน UIViewController viewDidLoad: method หรือ applicationDidFinishLaunching: method หรือใช้การหมุนอัตโนมัติ ("Autoresizing behavior", หน้า 124)

มองหา "การเปิดในโหมดแนวนอน" หน้า 102


4

ดูคำตอบนี้: โหมดแนวนอนสำหรับ iPhone หรือ iPad เท่านั้น

  1. เพิ่มการวางแนวให้กับ plist
  2. shouldAutorotateToInterfaceOrientation = ใช่ในไฟล์ทั้งหมด

แม้ว่าคุณจะใช้โหมดผสมคุณอาจจะดีกว่าด้วย

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.