2010-05-19 33 views
18

Tôi đã viết ứng dụng Universal ở chế độ dọc, và bây giờ sau khoảng 15 tệp nib, nhiều viewCotnrollers, Tôi muốn triển khai thực hiện shouldAutorotateToInterfaceOrientation và thiết kế một số màn hình ở chế độ ngang.shouldAutorotateToInterfaceOrientation không hoạt động

thêm:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
return YES; 
} 

cho TẤT CẢ các viewControllers của tôi, không làm việc.

Trong khi gỡ lỗi, tôi thấy rằng phương pháp này được gọi, nhưng nó sẽ không hoạt động! không phải trong giả lập, không có trong thiết bị, không phải trong Iphone, không phải trong Ipad!

tôi đã tìm kiếm một số câu trả lời trong diễn đàn này, và thấy một số lời khuyên để sử dụng:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
return (interfaceOrientation == UIInterfaceOrientationPortrait || 
    interfaceOrientation == UIInterfaceOrientationLandscapeLeft || 
    interfaceOrientation == UIInterfaceOrientationLandscapeRight || 
    interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown); 
} 

Không làm việc một trong hai,

thêm:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 

vào chế độ xem của tôiDidLo quảng cáo và viewDidUnload tương ứng cũng không hoạt động.

Tôi bị mất .. Mọi trợ giúp đều sẽ thực hiện!

chỉ một thông tin khác ... tất cả các Chế độ xem của tôi thuộc loại UIControl, vì tôi cần TuchUpInside hoạt động.

Khẳng định sự trợ giúp của bạn.

+0

Bạn đang xem phiên bản thiết bị và/hoặc trình mô phỏng này? Loại điều hướng gốc của bạn hoặc bộ điều khiển thanh tab là gì? – warrenm

+0

Xcode 3.2.2, iPhone mô phỏng 3.1.3, (ipad 3.2) và sử dụng thiết bị 3.1.3. Tôi có cả Thanh tab và Bộ điều khiển điều hướng trong tệp mainWindow Nib của tôi. nhưng tất cả các lớp học của tôi là lớp con của UIViewController –

+0

ai đó? một cái gì đó? –

Trả lời

44

Đảm bảo tất cả chế độ xem gốc của bạn đều tự động nhậnSubviews = YES. Bạn có thể cần phải làm điều này trong mã nếu bạn đã không đặt lò xo và struts trong IB cho tất cả các quan điểm của bạn.

Trích dẫn hướng dẫn của người sử dụng giao diện Builder:

Chú ý: Trong một tập tin nib Cocoa, nếu bạn không đặt bất kỳ lò xo hoặc thanh chống cho tầm nhìn của bạn trong giao diện Builder nhưng sau đó làm sử dụng setAutoresizingMask: phương pháp thêm hành vi tự động hóa tại thời gian chạy là , chế độ xem của bạn có thể vẫn không thể hiện hành vi tự động chính xác . Lý do là Giao diện Trình xây dựng vô hiệu hóa tự động của một trẻ em của toàn bộ phụ huynh xem nếu những đứa trẻ đó không có lò xo và thanh chống được thiết lập. Để bật lại hành vi tự động hóa , bạn phải chuyển YES đến phương thức setAutoresizesSubviews: chế độ xem gốc. Khi thực hiện việc đó, chế độ xem con của sẽ tự động xác định chính xác.

Một vài điều khác phải nhận thức được:

  1. Một UINavigationController sẽ chỉ dừng quay nếu điều khiển xem gốc của nó cũng được thiết lập để dừng quay.

  2. Một UITabBarController sẽ chỉ tự động sửa nếu tất cả các bộ điều khiển chế độ xem của nó được đặt thành tự động sửa.

+4

"Một UITabBarController sẽ chỉ autorotate nếu tất cả các bộ điều khiển xem của nó được thiết lập để autorotate." --- giúp tôi mọi lúc; điều này chỉ đơn giản là sai cách để Apple triển khai API. Hy vọng rằng họ sẽ sửa chữa nó một ngày. – Adam

+0

+1 điều này sẽ chính xác và giải thích hoàn toàn hành vi tùy chỉnh cho bất kỳ ai tạo "ứng dụng thông thường" với nav- và thanh tabbarcontrollers - nó đã làm cho tôi và nó hoạt động. Một lưu ý phụ, một ứng dụng được xây dựng với navcontrollers bên trong một thanh tabbar trong IB sẽ nhận được rootcontroller đúng, và các thanh chống mặc định, tự động, và xem các thiết lập định hướng khi tạo các viewcontrollers là tốt, vì vậy không cần thiết lập hoặc sửa bất kỳ cái nào. –

+0

"Một UITabBarController sẽ chỉ autorotate nếu tất cả các bộ điều khiển xem của nó được thiết lập để autorotate." !!!! (gấu lặp lại :). Có vẻ như đây không phải là trường hợp cho iOS 6 trở lên, nhưng là cho iOS 5 (đã rất bối rối bởi hành vi). –

2
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    UIInterfaceOrientation des=self.interfaceOrientation; 

    if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) //iPad 
    { 
     if(des==UIInterfaceOrientationPortrait||des==UIInterfaceOrientationPortraitUpsideDown)//ipad-portairait 
     { 

     } 
     else//ipad -landscape 
     { 

     } 
    } 
    else//iphone 
    { 
     UIInterfaceOrientation des=self.interfaceOrientation; 

     if(des==UIInterfaceOrientationPortrait||des==UIInterfaceOrientationPortraitUpsideDown) //iphone portrait 
     { 

     } 
     else //iphone -landscape 
     { 

     } 
    } 
return YES; 
} 
+0

Cảm ơn bạn đã chỉnh sửa. –

0

Tôi có vấn đề này nhưng nó hoạt động trong iOS6 nhưng không iOS5. Hóa ra tôi đã có một cái nhìn trong bảng phân cảnh của tôi rằng tôi đã không thực hiện một lớp viewcontroller cho được nêu ra.

0

... và cuối cùng nhưng không kém phần quan trọng, đảm bảo bạn chưa kích hoạt cài đặt "Portrait Orientation Locked" trên thiết bị thử nghiệm của bạn (tất nhiên không áp dụng cho trình mô phỏng), điều này sẽ vô hiệu hóa xoay trong bất kỳ ứng dụng nào không có vấn đề gì trả về shouldAutorotateToInterfaceOrientation.

1

Bạn đang xây dựng iOS nào? Nó đã không được chấp nhận trong iOS 6.0. (Bạn nên ghi đè supportedInterfaceOrientations và phương pháp preferredInterfaceOrientationForPresentation thay thế.)

Ngoài ra bạn có thể gọi shouldAutorotate trên lớp UIViewController:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/shouldAutorotate


Đảm bảo bạn đã kiểm tra giao diện Định hướng hỗ trợ trong "Summery "tab của cài đặt dự án (Chọn tên dự án trong 'Dự án Navigator' ở trên cùng).

Nếu bạn chưa chọn định hướng bạn muốn sử dụng ở đây thì trình mô phỏng/iphone sẽ không cho phép màn hình thay đổi hướng.