Ứng dụng iPhone ở chế độ ngang, hệ thống 2008


98

Xin lưu ý rằng câu hỏi này có từ năm 2008 và bây giờ chỉ được quan tâm trong lịch sử.


Cách tốt nhất để tạo một ứng dụng iPhone chạy ở chế độ ngang ngay từ đầu, bất kể vị trí của thiết bị là gì?

Cả lập trình và sử dụng Trình tạo giao diện.


5
Đối với bất kỳ độc giả nào trong tương lai, vui lòng lưu ý rằng vấn đề nổi tiếng này hiện đã được Apple GIẢI QUYẾT vào năm 2011. Lưu ý dự án thử nghiệm trong câu trả lời bên dưới.
Fattie

Câu trả lời:


47

Chỉ có câu trả lời trong lịch sử. Hết thời một cách ngoạn mục.

Xin lưu ý rằng câu trả lời này hiện đã rất lỗi thời /

Câu trả lời này chỉ là một sự tò mò lịch sử .


Tin tức thú vị! Theo phát hiện của Andrew dưới đây, vấn đề này đã được Apple khắc phục trong 4.0+.

Có vẻ như KHÔNG còn cần thiết phải ép buộc kích thước của chế độ xem trên mọi chế độ xem nữa và vấn đề nghiêm trọng cụ thể về cảnh quan "chỉ hoạt động lần đầu tiên" đã được giải quyết.

Kể từ tháng 4 năm 2011, không thể thử nghiệm hoặc thậm chí xây dựng bất kỳ thứ gì dưới 4.0, vì vậy câu hỏi hoàn toàn là một sự tò mò lịch sử. Thật không thể tin được nó đã gây ra bao nhiêu rắc rối cho các nhà phát triển trong một thời gian dài!


Đây là cuộc thảo luận và giải pháp ban đầu. Điều này hoàn toàn không liên quan bây giờ, vì những hệ thống này thậm chí không thể hoạt động.


Thật là CỰC KỲ KHÓ KHĂN để làm cho công việc này hoạt động đầy đủ - có ít nhất ba vấn đề / lỗi khi chơi.

thử cái này .. thiết kế cảnh quan trình tạo giao diện

Đặc biệt lưu ý rằng nơi nó nói "và bạn cần sử dụng shouldAutorotateToInterfaceOrientation đúng cách ở mọi nơi", nó có nghĩa là ở mọi nơi, tất cả các chế độ xem toàn màn hình của bạn.

Hy vọng nó sẽ giúp trong cơn ác mộng này!

Một lời nhắc quan trọng về vấn đề BỔ SUNG nổi tiếng hiện có ở đây: nếu bạn đang cố gắng hoán đổi giữa HƠN MỘT chế độ xem (tất cả chế độ xem), NÓ ĐƠN GIẢN KHÔNG HOẠT ĐỘNG . Cần phải nhớ điều này nếu không bạn sẽ lãng phí nhiều ngày cho vấn đề. Nó đúng là KHÔNG CÓ KHẢ NĂNG. Đây là lỗi mở lớn nhất được biết đến trên nền tảng iOS. Theo nghĩa đen, không có cách nào khiến phần cứng làm cho chế độ xem thứ hai mà bạn tải, trở nên ngang. Cách giải quyết khó chịu nhưng đơn giản và những gì bạn phải làm là có một UIViewController bậc thầy tầm thường không làm gì khác ngoài việc ngồi đó và cho phép bạn hoán đổi giữa các chế độ xem của mình.

Nói cách khác, trong iOS do một lỗi lớn cần biết:

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

Bạn chỉ có thể làm điều đó một lần . Sau đó, nếu bạn cố gắng xóa happyThing.view và thay vào đó đặt newThing.view, nó KHÔNG hoạt động - VÀ ĐÓ LÀ ĐÓ. Máy sẽ không bao giờ xoay chế độ xem sang ngang. Không có cách sửa lỗi nào, ngay cả Apple cũng không thể làm cho nó hoạt động. Cách giải quyết mà bạn phải áp dụng là có một UIViewController tổng thể chỉ đơn giản là nằm ở đó và chỉ giữ các chế độ xem khác nhau của bạn (happyThing, newThing, v.v.). Hy vọng nó giúp!


2
Tôi tin rằng điều này đã được khắc phục trong 4.x. Chúng tôi đã xuất xưởng một trò chơi có nhiều màn hình khác nhau, một số phong cảnh và một số chân dung, và nó không hoạt động trong 3.x. Không muốn đi vào chế độ xem giả để xử lý nó, thay vào đó chúng tôi yêu cầu 4.x - mà một năm sau khi câu hỏi này được hỏi, có lẽ là OK.
AndrewS

Chúng tôi không làm "luôn ngang" mà thay vào đó là ngang hoặc dọc. Mỗi VC được thêm trực tiếp vào và xóa khỏi cửa sổ. Ứng dụng khởi chạy ngang, vẫn như vậy qua một số chuyển đổi màn hình. Chúng tôi không sử dụng chế độ xem giả, nhưng chúng tôi sẽ ghi đè nênAutorotate trong mọi màn hình. Không có vấn đề gì trên 4.x, từ cảm ứng đến bàn phím đến điện thoại.
AndrewS

41

Từ Trang web Nhà phát triển của Apple:

Để khởi động ứng dụng của bạn ở chế độ ngang để thanh trạng thái ở vị trí thích hợp ngay lập tức, hãy chỉnh sửa tệp Info.plist của bạn để thêm khóa UIInterfaceOrientation với giá trị thích hợp (UIInterfaceOrientationLandscapeRight hoặc UIInterfaceOrientationLandscapeLeft), như được hiển thị trong Liệt kê 2.

Liệt kê 2: Khởi động ứng dụng của bạn ở chế độ ngang

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

5
Điều này cộng với các phương thức shouldAutorotateToInterfaceOrientation của bạn trả về (interfaceOrientation! = UIInterfaceOrientationPortrait); và bạn đã hoàn thành.
Michael Behan

5
Câu hỏi hỏi cách khởi động thiết bị ở chế độ ngang. Các câu trả lời cung cấp thông tin đó. Định hướng xử lý sau đó không được đề cập trong câu hỏi. +1 Michael Pryor
ingh.am,

1
Thật hấp dẫn, "câu trả lời" trên thực tế sẽ KHÔNG khởi động thiết bị ở chế độ ngang - !! Đây có lẽ là lỗi / khó khăn nổi tiếng nhất trong tất cả môi trường của Apple. Đó là điều cơ bản cho nhà phát triển iPad đang làm việc rất hiệu quả!
Fattie 29/10/10

@mbehan Ngoài ra còn có UIInterfaceOrientationPortraitUpsideDown, do đó không phải là bản sửa lỗi. Ngoài ra, UIInterfaceOrientation trong .plist chỉ được hỗ trợ trên 3.2+, không phải trên các thiết bị 3.1.3 trở lên (và hãy nhớ iPhone 2G bị kẹt trên phiên bản đó).
Ivan Vučica

28

Tóm tắt và tích hợp từ tất cả các bài đăng, sau khi tự mình kiểm tra; kiểm tra bản cập nhật cho 4.x, 5.x bên dưới.

Kể từ 3.2, bạn không thể thay đổi hướng của một ứng dụng đang chạy từ mã.

Nhưng bạn có thể bắt đầu một ứng dụng với một hướng cố định, mặc dù làm như vậy điều này không đơn giản.

Hãy thử với công thức này:

  1. thiết lập hướng của bạn UISupportedInterfaceOrientationstrong Info.plisttệp
  2. trong cửa sổ của bạn xác định một "bộ điều khiển chế độ xem cơ sở" 480x320. Mọi chế độ xem khác sẽ được thêm làm chế độ xem phụ cho chế độ xem của nó.
  3. trong tất cả các bộ điều khiển chế độ xem, hãy thiết lập shouldAutorotateToInterfaceOrientation:phương thức (tất nhiên là để trả về cùng một giá trị mà bạn đã xác định trong plist)
  4. trong tất cả các bộ điều khiển chế độ xem, hãy đặt chế độ xem nền với

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

    trong viewDidLoadphương pháp.

Cập nhật (iOS 4.x, 5.x) : Hướng dẫn lập trình ứng dụng Apple iOS có đoạn "Khởi chạy ở chế độ ngang" trong chương "Thủ thuật ứng dụng nâng cao".

Người giới thiệu:


1
Tôi có thể xác nhận đây là giải pháp duy nhất, thực sự hiệu quả (với một bổ sung nhỏ). Tôi đã mất hàng giờ để tìm và đánh giá điều này. Tất cả các câu trả lời khác chỉ là giải pháp một phần cho vấn đề.
Johannes Rudolph

8

Đầu tiên tôi đặt trong info.plist

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

sau đó tôi đặt mã này trong 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)]; 

Bằng cách này, tôi có thể làm việc trên chế độ xem trong Trình tạo giao diện ở chế độ ngang.


7

Câu trả lời của sasb và michaelpryor dường như đúng, nhưng nếu nó không phù hợp với bạn, hãy thử thay thế này:

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

Hoặc cái này:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Hoặc cái này:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

Bạn cũng có thể phải gọi điện window makeKeyAndVisible;trước.

Một vài liên kết: Phát triển ở chế độ ngang , iPhone SDK: Làm cách nào để chỉ buộc chế độ Ngang?

@Robert: vui lòng tham khảo SDK iPhone, NDA và Stack Overflow .


6

Tôi ngạc nhiên là chưa có ai đưa ra câu trả lời này:

Trong tất cả các thử nghiệm của tôi khi loại bỏ bộ điều khiển chế độ xem phương thức, định hướng ưu tiên của bộ điều khiển chế độ xem chính được đặt trong đó shouldAutorotateToInterfaceOrientationđược thực hiện ngay cả khi là một phần của UINavigationController. Vì vậy, giải pháp cho điều này rất đơn giản:

Tạo một UIViewController giả với một UIImageView cho nền. Đặt hình ảnh thành hình ảnh default.png mà ứng dụng của bạn sử dụng khi khởi động.

Khi viewWillAppearđược gọi trong bộ điều khiển chế độ xem gốc của bạn, chỉ cần trình bày bộ điều khiển chế độ xem giả mà không có hoạt ảnh.

khi viewDidAppearđược gọi trong bộ điều khiển chế độ xem giả của bạn, hãy loại bỏ bộ điều khiển chế độ xem bằng hoạt ảnh hòa tan chéo đẹp mắt.

Điều này không chỉ hoạt động, nhưng nó trông tốt! BTW, chỉ để làm rõ, tôi làm bộ điều khiển chế độ xem gốc viewWillAppearnhư thế này:

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

5

Hướng dẫn lập trình hệ điều hành iPhone mới nhất có một phần đầy đủ về điều này, với mã mẫu. Tôi chắc chắn đây là một bổ sung gần đây, vì vậy có thể bạn đã bỏ lỡ nó. Nó giải thích tất cả các điều kiện bạn phải tuân thủ; về cơ bản...

  • đặt thuộc tính Info.plist (điều này thay đổi vị trí của thanh trạng thái, nhưng không thay đổi chế độ xem)
  • xoay chế độ xem của bạn theo cách thủ công xung quanh trung tâm của nó, trên phương thức UIViewController viewDidLoad: hoặc ứng dụng của bạnDidFinishLaunching: phương pháp hoặc thực hiện tự động xoay ("Tự động hóa hành vi", trang 124)

Tìm "Khởi chạy ở Chế độ ngang", trang 102.


4

Xem câu trả lời này: Chế độ ngang CHỈ dành cho iPhone hoặc iPad

  1. thêm định hướng vào plist
  2. shouldAutorotateToInterfaceOrientation = CÓ trong tất cả các tệp

Mặc dù nếu bạn đang sử dụng các chế độ hỗn hợp, bạn có thể tốt hơn với

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.