7

Đây là một quan sát nhiều hơn bất cứ điều gì, bởi vì tôi dường như đã tìm thấy một công việc xung quanh ...[UIDevice currentDevice] .orientation == UIDeviceOrientationUnknown sau UINavigationController đẩy

Đoạn code dưới đây không làm việc khi nó trong một bộ điều khiển đã được đẩy lên một ngăn xếp UINavigationController. Trong trường hợp này, [UIDevice currentDevice].orientation liên tục trả về UIDeviceOrientationUnknown.

-(void)layoutAccordingToOrientation { 
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation; 
    NSLog(@"layoutAccordingToOrientation/orientation==%i", orientation); 
    if (UIInterfaceOrientationIsLandscape(orientation)) { 
     : 
     _detailToolbar.frame = CGRectMake(0, 660, 1024, 44); 
    } else { 
     : 
     _detailToolbar.frame = CGRectMake(0, 916, 768, 44); 
    } 
} 

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self layoutAccordingToOrientation]; 
} 

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

Cuộc gọi sau đã được thực hiện:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

Để làm việc xung quanh UIDeviceOrientationUnknown -problem này, bây giờ tôi sử dụng sau đây thay vì:

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
if (UIInterfaceOrientationIsLandscape(orientation)) { 
    etc. 
} else { 
    etc. 
} 

... trong đó hoạt động mỗi lần.

Tuy nhiên, tôi không thấy lý do tại sao biến thể đầu tiên sẽ không hoạt động trong ngữ cảnh của trình điều khiển chế độ xem được đẩy. Ý tưởng bất cứ ai? Nó chỉ đơn giản là một lỗi?

+0

Tôi gặp vấn đề tương tự, tuy nhiên tôi không thể làm việc xung quanh bạn để làm việc trong tình huống của mình. – Flea

Trả lời

3

tôi có thể nghĩ đến một vài điều ở đây, nhưng tôi không chắc chắn họ là những gì bạn đang tìm kiếm ...

Thứ nhất, khi ứng dụng được đưa ra, thường là hướng thiết bị trả về UIDeviceOrientationUnknown vì lý do hiệu suất. Một điều bạn có thể thử là bố trí các bản xem phụ của bạn bên trong một .nib hoặc trong Bảng phân cảnh của bạn, với các tùy chọn tự động hóa chính xác và để iOS làm điều đó.

Thứ hai, nếu bạn giống tôi, có thể bạn đang thử nghiệm trên thiết bị ngay bên cạnh máy tính của bạn, đang nằm trên bàn. Vâng, trong trường hợp đó, bạn là không phải sẽ nhận được điều UIDeviceOrientationUnknown. Bạn thực sự nên thử nghiệm cho UIDeviceOrientationIsValidInterfaceOrientation([[UIDevice currentDevice] orientation]). Ví dụ: nếu thiết bị đang nằm xuống phía sau, thiết bị sẽ trả về yes cho câu lệnh đó. Điều này cũng có nghĩa là khi bạn sử dụng UIInterfaceOrientationIsLandscape(orientation), bạn sẽ nhận được kết quả phù hợp vì lý do sai. UIInterfaceOrientationIsLandscape trả về false không phải vì hướng của thiết bị là UIDeviceOrientationPortrait, nhưng vì nó không hợp lệ.

Không chắc chắn nếu điều này có ích, nhưng phải mất một lúc để hiểu điều đó và tôi nghĩ sẽ thật tuyệt khi chia sẻ thông tin này! :)