2013-01-17 23 views
14

Nếu tôi có con trỏ đến UIViewController, tôi có thể được thông báo khi nó thay đổi interfaceOrientation mà không sửa đổi mã của bộ điều khiển không?Tôi có thể quan sát khi một UIViewController thay đổi interfaceOrientation?

Đặt cược tốt nhất của tôi để phát hiện các thay đổi trong hướng thiết bị và sau đó xem liệu UIViewController có/đã xoay (d) không?

+0

không chắc chắn nếu câu hỏi vẫn còn thực tế, nhưng bạn có thể sử dụng phương pháp objc để thêm mã của riêng bạn vào mã 'UIViewController'. Điều này sẽ giống như trao đổi '-didRotateFromInterfaceOrientation:' với việc thực hiện của riêng bạn trong đó có một cuộc gọi đến phương thức xử lý của bạn đã thay đổi hướng và một cuộc gọi đến thực hiện ban đầu – medvedNick

+0

@medvedNick Điều đó có vẻ hợp lý. Tôi có thể gọi cho đại biểu của tôi sau đó gọi thực hiện ban đầu. Tôi có thể hơi lo lắng về những tác dụng phụ tiềm ẩn. –

Trả lời

16

Bạn có thể sử dụng NSNotificationCenter:

[[NSNotificationCenter defaultCenter] addObserver:self // put here the view controller which has to be notified 
             selector:@selector(orientationChanged:) 
              name:@"UIDeviceOrientationDidChangeNotification" 
              object:nil]; 
- (void)orientationChanged:(NSNotification *)notification{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

    //do stuff 
    NSLog(@"Orientation changed");   
} 
+3

Hmm. Tôi nghĩ tôi không rõ ràng. Tôi muốn biết định hướng rõ ràng của một ViewController chứ không phải là thiết bị. Nói cách khác, đối tượng của tôi muốn quan sát một bộ điều khiển xem để xem hướng của nó, có thể khác với hướng của thiết bị và có thể không thay đổi khi thiết bị thay đổi hướng. Câu trả lời này là một phần của những gì tôi đã ngụ ý trong phần thứ hai của câu hỏi của tôi. –

2

Bạn có thể sử dụng phương pháp willAnimateRotationToInterfaceOrientation:duration: trên UIViewController bạn và sau đó đặt lại vị trí bất kỳ UIViews (hoặc bất kỳ mã khác) cho ngang hoặc dọc. Ví dụ.

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
    // change positions etc of any UIViews for Landscape 
    } else { 
    // change position etc for Portait 
    } 

    // forward the rotation to any child view controllers if required 
    [self.rootViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
} 
+1

Thật không may điều này có nghĩa là thay đổi mã của UIViewController. Ở đây tôi chỉ có một con trỏ đến nó và muốn quan sát hành vi của nó. Những gì tôi thực sự muốn làm là được thông báo khi "interfaceOrientation" trả về một giá trị khác. –

+0

NB: Điều này không được chấp nhận trong iOS 8. http://stackoverflow.com/questions/25238620/ios-8-rotation-methods-deprecation-backwards-compatibility – jowie

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