2010-11-02 39 views
13

Tôi có ứng dụng iPad được tạo bằng mẫu SplitView. Tôi tự hỏi cách tốt nhất để hạn chế ứng dụng của tôi ở chế độ ngang là gì?Làm cách nào để hạn chế ứng dụng của tôi ở chế độ ngang?

Tôi đã cố gắng trọng shouldAutorotateToInterfaceOrientation: phương pháp trong DetailViewController.m

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

nhưng 4.2 GM vẫn buggy và nó không hiển thị các điểm điều khiển. Tôi có những lựa chọn nào khác?

Xin cảm ơn trước.

UPDATE1

  • Tôi đã đệ trình một báo cáo lỗi: Bug ID #8620135

  • Ứng dụng của tôi là gần như hoàn tất và tôi phải tìm một công việc arround vì tôi không nghĩ rằng họ sẽ giải quyết vấn đề này trước khi chính thức ra mắt 4.2 (GM đã hết!)

    Để tạo lại lỗi, chỉ cần sử dụng mẫu SplitView và ghi đè lên phía trên phương pháp trong bất kỳ UIViewControllers (RootViewController hoặc DetailViewControllers)

UPDATE2

Tôi đã tìm thấy một công việc xung quanh. (Xem UPDATE3 cho hoàn chỉnh công việc xung quanh)

Set UISupportedInterfaceOrientations chỉ để hỗ trợ Cảnh, điều này sẽ buộc các ứng dụng để bắt đầu trong chế độ phong cảnh cho phép DetailViewController để bắt đầu một cách chính xác (do đó hiển thị chính xác)

<key>UISupportedInterfaceOrientations</key> 
<array> 
    <string>UIInterfaceOrientationLandscapeLeft</string> 
    <string>UIInterfaceOrientationLandscapeRight</string> 
</array> 

Nhưng nếu bạn hãy xoay điện thoại, nó quay chế độ Portrait !!!, vì vậy vẫn còn cần thiết để ghi đèshouldAutorotateToIntercafeOrientation: như trên

Thảo luận:

Nếu điều này không phải là lỗi, tôi sẽ mong đợi một cảnh báo hoặc lỗi thực hiện, ngoại lệ hoặc một cái gì đó khi khởi động ứng dụng theo hướng không được bộ điều khiển xem hỗ trợ. Bên cạnh đó, tại sao chỉ DetailViewController không hiển thị? Nếu điều này sẽ được đặc điểm kỹ thuật, sau đó RootViewController cũng nên không tải sau đó. Bạn không nghĩ sao? nhờ bạn giúp đỡ ...;)

UPDATE3

Sau khi thử nghiệm thêm tôi đã nhận ra rằng trên công việc xung quanh không làm việc trong một số trường hợp. Ví dụ khi khởi động ứng dụng khi thiết bị ở chế độ ngang sẽ không hoạt động !. Vấn đề thực sự có vẻ là trong iOS4.2GM UISplitViewController cần tất cả các bộ điều khiển của nó có tất cả các phép quay có sẵn tại thời gian tải của nó. Vì vậy, là cần thiết để lừa anh ta để nó tải trong chế độ phong cảnh và sau đó không cho phép anh ta để xoay bộ điều khiển xem của nó.

Vì vậy, đây là công việc mới xung quanh cho iBug gây phiền nhiễu này.

Bước 1: Set Info.plist như vậy:

<key>UISupportedInterfaceOrientations</key> 
<array> 
    <string>UIInterfaceOrientationLandscapeLeft</string> 
    <string>UIInterfaceOrientationLandscapeRight</string> 
</array> 

Bước 2 Đặt một lá cờ mới trong DetailViewController.m hoặc .h (từ Template SplitView)

BOOL lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135. 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    //WORK-ARROUND: Bug ID# 8620135. 
    if (lockRotation) { 
     return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
    }else{ 
     return YES; 
    } 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    //set NO here since this is called before shouldAutorotateToInterfaceOrientation method is called 
    lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135. 
} 
- (void)viewDidAppear:(BOOL)animated { 
    //set YES as soon as possible, but after shouldAutorotateToInterfaceOrientation method was called 
    lockRotation = YES; //WORK-ARROUND: Bug ID# 8620135. 
    [super viewDidAppear:animated]; 
} 

LƯU Ý QUAN TRỌNG: Xin lưu ý rằng lỗi này chỉ xuất hiện khi UISplitViewController được tải và không phải mọi lúc chế độ xem của nó xuất hiện. Do đó, để xem lỗi này, hãy đảm bảo ứng dụng đã bị chấm dứt trước đó.

+1

có thể là một lỗi? ;) –

+0

câu hỏi nói rằng bạn đang thực hiện thay đổi trong DetailViewController, đó là bộ điều khiển chính xác sẽ ghi đè phương pháp? –

+0

Tôi đã báo cáo lỗi – nacho4d

Trả lời

2

Tôi đã đặt câu hỏi với số tiền là 500 là seems to be the same thing you're facing.

Từ kinh nghiệm hạn chế của tôi, việc tạo ứng dụng iPhone chỉ dành cho cảnh quan dễ dàng hơn nhiều so với ứng dụng iPad chỉ dành cho cảnh quan. Tôi không chắc tại sao có bất kỳ sự khác biệt nào, nhưng các bước mà Apple nói để thực hiện để làm cho nó không chỉ hoạt động theo phong cách riêng của họ.

+0

Tôi nghĩ rằng tôi đã tìm thấy một gợi ý trong chủ đề đó, Đây là những gì tôi đã làm và nó đã làm việc nhưng điều này chắc chắn là một công việc-arround. Điều này không cần thiết tôi tin. Xem bản cập nhật của tôi2. – nacho4d

+0

Ngay cả khó khăn, tôi cũng tìm thấy câu trả lời ... câu trả lời này đưa tôi đến với nó. Vì vậy, cảm ơn;) – nacho4d

0

Kiểm tra số iPhone app in landscape mode này nếu bạn chưa có. Tôi sẽ đề nghị chỉ cần thêm UISupportedInterfaceOrientations vào Info.plist của bạn và xác định hai định hướng ngang. Nhưng, rõ ràng, điều này là không đủ, theo câu trả lời cho câu hỏi được trích dẫn.

1

Hãy thử điều này (nó hoạt động):

-(BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation { 
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
     return YES; 
    } 
    else 
    { 
     return NO; 
    } 
} 
+0

sửa đổi điều kiện 'nếu' theo chế độ bạn muốn nó. Mã trên hạn chế nó ở chế độ ngang. Thay đổi kiểm tra 'if' thành UIInterfaceOrientationLandscapeLeft để khóa trái. Đối với cả hai chế độ phong cảnh, làm nếu (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) – Sid

+0

Không hoạt động ... Điều này là đủ khi không sử dụng UISplitViewController tôi tin. – nacho4d

+0

'UIInterfaceOrientationIsLandscape (interfaceOrientation);' là Apple macro để làm những gì bạn đã nói trong câu trả lời của bạn ngay. Vì vậy, người hỏi đã làm những gì bạn nói để làm. –

0

Tôi tin rằng đây là một BUG, ​​tôi phải đối mặt với vấn đề này cũng có. Nó là một cái gì đó để làm với

UIInterfaceOrientationLandscapeLeft 

Để tái tạo tình trạng này:

1) Tạo một dự án mới sử dụng iPad UISplitViewController mẫu

2) Sửa info.plist

Supported interface orientations 
-Landscape (left home button) 
-Landscape (right home button) 

3) DetailViewController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// return YES; 
NSLog(@"RotateToInterface:[%d] vs LandscapeLeft[%d]", interfaceOrientation, UIInterfaceOrientationLandscapeLeft); 
return interfaceOrientation == UIInterfaceOrientationLandscapeLeft; 
} 

4) Chạy nó .... Bạn sẽ thấy một khung nhìn trống màu đen. và không có vấn đề làm thế nào bạn bật. "UIInterfaceOrientationLandscapeLeft" không bao giờ được phát hiện.

Bằng cách này, nacho4d thêm hoạt động kiểm tra BOOL đang hoạt động. Thumbs UP :)

Các vấn đề liên quan