2010-08-04 36 views
21

Trong ứng dụng iPad của tôi, tôi cần chạy một số mã bố cục để đặt bố cục phù hợp tùy theo hướng. Theo mặc định, bố cục được định cấu hình cho hướng ngang, vì vậy trong trường hợp ứng dụng bắt đầu ở chế độ dọc, tôi cần thực hiện thêm hành động để định cấu hình chế độ xem phù hợp để hiển thị theo chiều dọc.Nhận định hướng khởi chạy của ứng dụng iPad

Trong phương thức -application:didFinishLaunchingWithOptions: của tôi, tôi kiểm tra hướng bằng cách sử dụng [[UIDevice currentDevice] orientation]. Vấn đề ở đây là nó luôn luôn trả về chân dung ngay cả khi ứng dụng đang bắt đầu ở chế độ ngang. Có cách nào để khắc phục điều này?

Trả lời

36

Đây là hành vi mong đợi. Quoth the UIViewController documentation:

Lưu ý: Lúc khởi động, ứng dụng nên luôn luôn thiết lập giao diện của họ trong một hướng dọc. Sau khi trả về phương thức application:didFinishLaunchingWithOptions:, ứng dụng sử dụng cơ chế xoay bộ điều khiển chế độ xem được mô tả ở trên để xoay các chế độ xem theo hướng thích hợp trước khi hiển thị cửa sổ.

Nói cách khác, theo như thiết bị có liên quan, hướng chân dung trong khi ứng dụng khởi chạy. Tại một số thời điểm sau application:didFinishLaunchingWithOptions:, nó sẽ phát hiện hướng khác và gọi phương thức shouldAutorotateToInterfaceOrientation: của bạn và sau đó là other view rotation methods, bạn nên xử lý như bình thường.

+0

để được trợ giúp về đĩa hoặc kết quả nhanh chóng, hãy xem ..... http://stackoverflow.com/questions/5888016/ios-device-orientation-on-load/32758397#32758397 này – jenish

0

Bạn muốn chắc chắn rằng bạn thiết lập các phím thích hợp trong Info.plist của bạn để cho phép định hướng bạn muốn:

UISupportedInterfaceOrientations 
    UIInterfaceOrientationPortrait 
    UIInterfaceOrientationPortraitUpsideDown 
    UIInterfaceOrientationLandscapeLeft 
    UIInterfaceOrientationLandscapeRight 
+0

Tôi có tất cả 4 định hướng trong tệp plist của mình. – indragie

13

Sử dụng self.interfaceOrientation trong điều khiển điểm của bạn - đó là một tài sản của UIViewController được thiết lập bởi iOS cho bạn và trong một số trường hợp đáng tin cậy hơn [[UIDevice currentDevice] orientation].

Dưới đây là mô tả chi tiết: http://bynomial.com/blog/?p=25

+0

Giải pháp tuyệt vời, như thế này. – Roger

+0

Có ba thuộc tính định hướng: 'UIDevice.orientation',' UIViewController.interfaceOrientation' và 'UIApplication.statusBarOrientation'. – rpetrich

+0

Đơn giản và cho kết quả rất nhất quán. – krsteeve

2

Sử dụng định hướng thanh trạng thái để phát hiện.

UIInterfaceĐịnh hướng định hướng = [UIApplication sharedApplication] .statusBarOrientation;

sau đó thực hiện if trên "hướng" bạn đã thu được từ trên cao.

+0

Hãy coi chừng: InterfaceOrientation (= hướng thanh trạng thái) là * không * giống như hướng thiết bị! Do đó, nó không phù hợp để phát hiện phát hiện thiết bị. – auco

+2

Đối với tất cả các mục đích, nó mang lại cho tôi một kết quả định hướng nhất quán và chính xác hơn so với lớp UIDevice và phương pháp của nó. – Bourne

19

Đây là cách tốt nhất để kiểm tra định hướng khi khởi chạy. Đầu tiên, tạo một phương pháp mới trong appdelegate của bạn để kiểm tra định hướng:

-(void)checkLaunchOrientation:(id)sender{ 

    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;  
    BOOL isLandscape = UIDeviceOrientationIsLandscape(self.viewController.interfaceOrientation); 

    if (UIInterfaceOrientationIsLandscape(orientation) || isLandscape) { 
     //do stuff here 
    } 
} 

Tại cuối của -application:didFinishLaunchingWithOptions: chạy

 [self performSelectorOnMainThread:@selector(checkLaunchOrientation:) withObject:nil waitUntilDone:NO]; 
+1

Giải pháp tuyệt vời! Kiểm tra định hướng '[[UIDevice currentDevice]]' from _inside_ '-application: didFinishLaunchingWithOptions:' trả về định hướng không xác định nhưng kiểm tra từ một phương thức chạy bằng cách sử dụng 'performSelectorOnMainThread: withOptions: waitUntilDone:' hoạt động hoàn hảo. –

+0

LƯU Ý: Không hoạt động với iOS 7. –

0

Không phải là bạn cần câu trả lời khác, nhưng tôi nghĩ tôi nên nói thêm rằng bạn hầu như không bao giờ muốn sử dụng [[UIDevice currentDevice] orientation]. Phương thức đó trả về hướng của thiết bị, không nhất thiết phải giống như định hướng của giao diện.

4

Như đã đề cập trong bài đăng trên blog, có một tập hợp các macro cho hướng thử nghiệm. Tuy nhiên, bài đăng trên blog đó đề cập đến UIDeviceOrientationIsPortrait. Tôi thích những điều sau đây, đó là một bước ngoặt nhỏ.

if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) 
{ 
    NSLog(@"Portrait"); 
} 
else 
{ 
    NSLog(@"Landscape"); 
} 

Quan sát tôi thực hiện là bạn không thể gọi mã này trong chế độ xem bảng, được đẩy vào Trình điều khiển điều hướng được nhúng trong bộ điều khiển chia tách. Nói cách khác, bạn không thể gọi nó từ bộ điều khiển chế độ xem chính. Bạn phải thay thế "self.interfaceOrientation" bằng splitviewcontroller.interfaceOrientation, giả sử bạn duy trì một tham chiếu đến bộ điều khiển xem chia tách cha.

1

Vì vậy, câu hỏi là về việc kiểm tra hướng khi khởi động. Câu trả lời thật đáng buồn "Bạn không thể".

Nhưng Sau khi khởi động, bạn có thể kiểm tra hướng bình thường (như những người khác đã mô tả).

Nếu có ai khác đến đây tìm kiếm câu trả lời, chỉ cần ngừng tìm kiếm, khi khởi động biến định hướng không được đặt (tất cả khung xem/giới hạn cũng báo cáo ở dạng chân dung ngay cả khi chúng không có).

0

Không đúng là bạn không thể tìm ra định hướng khởi chạy, đúng là đau ở phía sau để làm như vậy.

đây là những gì bạn cần làm.

UIViewController đầu tiên của bạn cần phải có một số logic đặc biệt để thu thập thông tin bạn muốn.
thậm chí bạn có thể muốn tạo UIStartupController chỉ dành cho những mục đích này nếu điều đó quan trọng đối với luồng của bạn.
trong trường hợp dự án của tôi, chúng tôi đã có bộ điều khiển khởi động như vậy.

tất cả bạn cần là đoạn mã sau

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    self.launchOrientation = UIDeviceOrientationUnknown; 
    } 
    return self; 
} 

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration 
{ 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    if (self.launchOrientation == UIDeviceOrientationUnknown && duration > 0) 
    self.launchOrientation = UIInterfaceOrientationPortrait; 
    else 
    self.launchOrientation = toInterfaceOrientation; 
} 

về cơ bản, nếu chúng tôi không tung ra trong UIInterfaceOrientationPortrait, trình tự luân chuyển callback đầu tiên sẽ thực sự tiết lộ định hướng khởi động.
nếu được khởi chạy trong UIInterfaceOrientationPortrait, thì chúng ta cần phải kiểm tra xem thời lượng của vòng xoay đầu tiên có khác 0 hay không, và sau đó chúng ta biết rằng nó đã được phóng từ chân dung.

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