2010-11-21 34 views
6

[Câu hỏi được cập nhật]Cách thích hợp để phát hiện định hướng giao diện khi khởi chạy là gì?

Vì vậy, đây là vấn đề, tôi cuối cùng đã thu hẹp nó xuống này. Nếu bạn tạo một UIViewController mới trong tất cả các phương pháp

- (id)init; 
- (void)loadView; 
- (void)viewDidAppear:(BOOL)animated; 
- (void)viewDidLoad; 
(...) 

Các interfaceOrientation giữa các ý kiến ​​Portrait và nếu chế độ phong cảnh được phát hiện nó sẽ nhanh chóng xoay để định hướng đó. Mà sau đó có thể được phát hiện bằng cách sử dụng:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation; 

Vấn đề là trên iPad, nó yên tĩnh khó khăn để chuẩn bị giao diện của bạn cho định hướng giao diện hiện tại trong loadView (hoặc một trong những người khác) vì nó sẽ chỉ trở lại Chân dung. Điều này sẽ gây ra một số sự cố:

1) Tôi muốn nội dung của mình tải lại ở chế độ cổng, nhưng KHÔNG ở chế độ ngang. Thông thường tôi sẽ đặt một câu lệnh if trong loadView. Nếu ở chế độ dọc, hãy tải lại nội dung. Nhưng trong trường hợp này, nó sẽ luôn trả về ảnh chân dung và do đó luôn tải nội dung.

2) Tôi muốn sử dụng 'presentPopoverFromRect: inView: allowedArrowDirections: animated:' - phương thức khi ở chế độ dọc sao cho nó sẽ tự động hiển thị menu popover khi ứng dụng bắt đầu. Điều này sẽ làm hỏng ứng dụng khi được khởi chạy ở chế độ dọc. Lý do: 'Popovers không thể được trình bày từ một cái nhìn mà không có một cửa sổ.'.

Giả định an toàn duy nhất nằm trong 'didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation', nhưng phương pháp này sẽ không được kích hoạt nếu nó khởi chạy ở chế độ dọc.

// ----

Cập nhật (15.37)

'UIApplicationWillChangeStatusBarOrientationNotification'

Sẽ chỉ được đăng khi giao dịch hoán đổi sử dụng từ dọc sang ngang (hoặc vica lại). Nếu giao diện là vấn đề thì điều này có thể dễ dàng được giải quyết với quan sát cho rằng thông báo và

if (UIDeviceOrientationIsPortrait(interfaceOrientation)) { 
    // layout subviews for portrait mode 
} else { 
    // layout subviews for landscape mode 
} 

Nhưng vấn đề là tôi muốn biết trong chế độ mà nó là lúc khởi động để xác định khá hay không tôi nên tải lại nội dung , Tôi không thể tải lại nội dung và khi nó hoán đổi sang phong cảnh, hãy hủy bỏ nó.

+0

Tôi đã thử kiểm tra 'UIDeviceOrientationIsPortrait()' trong 'layoutSubviews' của lớp con' UIView' tùy chỉnh và tôi đang nhận định hướng chính xác. Bạn có thêm một số mã mà bạn có thể chia sẻ có thể giúp xác định vấn đề là gì không? Ngoài ra tự hỏi nếu UIDeviceOrientation và UIInterfaceOrientation giá trị có thể được nhận được sử dụng thay thế cho nhau? Điều đó đã khiến tôi bị mắc kẹt với các lỗi lạ trước đây. – justinkmunger

Trả lời

8

Hãy thử [[UIApplication sharedApplication] statusBarOrientation].

+0

Điều đó khác với [[UIApplication sharedApplication] statusBarOrientation]? – Mark

+0

Gah xin lỗi về điều đó. Câu trả lời được cập nhật. –

1

Tôi không chắc chắn nếu điều này thực sự sẽ giải quyết vấn đề của tôi, nhưng nhìn vào tài liệu tôi tìm thấy những điều sau đây:

typedef enum { 
    UIInterfaceOrientationPortrait   = UIDeviceOrientationPortrait, 
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, 
    UIInterfaceOrientationLandscapeLeft  = UIDeviceOrientationLandscapeRight, 
    UIInterfaceOrientationLandscapeRight  = UIDeviceOrientationLandscapeLeft 
} UIInterfaceOrientation; 

typedef enum { 
    UIDeviceOrientationUnknown, 
    UIDeviceOrientationPortrait, 
    UIDeviceOrientationPortraitUpsideDown, 
    UIDeviceOrientationLandscapeLeft, 
    UIDeviceOrientationLandscapeRight, 
    UIDeviceOrientationFaceUp, 
    UIDeviceOrientationFaceDown 
} UIDeviceOrientation; 

Vì vậy, kể từ FaceUp và úp mặt đã được thêm vào nhìn định hướng của Thiết bị là vô nghĩa vì lý do Giao diện. Do đó, về mặt lý thuyết, @MarkAdams là đúng đề cập rằng trong trường hợp này [[UIApplication sharedApplication] statusBarOrientation] nên được sử dụng cho định hướng giao diện.

Hoặc tất nhiên UIViewController có tùy chọn 'interfaceOrientation'.

6

Cách thích hợp là yêu cầu thiết bị cho hướng của nó dưới dạng chế độ xem về mặt kỹ thuật không có hướng. ;)

Vì vậy, bạn đã sử dụng đúng cách . Từ số documentation, bạn có thể thấy rằng trước tiên bạn cần tạo thông báo định hướng thiết bị trước khi thông tin này chính xác. Sau đó, nó sẽ hoạt động như mong muốn.

UIDevice *myDevice = [UIDevice currentDevice]; 
[myDevice beginGeneratingDeviceOrientationNotifications]; 
UIDeviceOrientation currentOrientation = [myDevice orientation]; 
[myDevice endGeneratingDeviceOrientationNotifications]; 

Lưu ý: Điều này mang lại cho bạn định hướng hiện tại của thiết bị. Nếu bộ điều khiển hiển thị/đầu hiển thị hiện tại không không phải cho phép xoay theo hướng này, bạn sẽ vẫn nhận được hướng thiết bị hiện tại, không phải là bộ điều khiển xem trên cùng hiện đang sử dụng.


Sửa sau khi câu hỏi được cập nhật:

Bạn đang đúng khi cho rằng định hướng cho bộ điều khiển xem trên cùng (làm việc một cách chính xác cho các bộ điều khiển subview) luôn trả về 1 (ví dụ: UIInterfaceOrientationPortrait) trong loadView. Tuy nhiên, phương pháp willRotateToInterfaceOrientation:duration: sẽ ngay lập tức sau đó được gọi và định hướng được truyền đến đó là chính xác, vì vậy bạn sẽ có thể sử dụng phương thức đó.

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toIfaceOrient 
           duration:(NSTimeInterval)duration 
+0

Xin chào Pascal, nó sẽ hoạt động với UIDevice tuy nhiên đó không phải là những gì tôi đang tìm kiếm. Cuối cùng tôi đã thu hẹp lỗi xuống, tôi sẽ cập nhật câu hỏi của mình. – Mark

+0

Tôi đã cập nhật câu trả lời, có thể phương pháp đó là giải pháp cho vấn đề của bạn. – Pascal

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