2010-03-10 33 views
7

Như tiêu đề cho biết. UIViewController của tôi sẽ không xoay bất kể cái gì. Khi nó tải shouldAutorotateToInterfaceOrientation đang được gọi nhưng sau đó nó không.UIViewController không tự động xoay

UPDATE 1:

Đó là một vấn đề thực sự thực sự lạ. Ít nhất là cho tôi. Và tôi sẽ cố gắng giải thích mọi thứ.

Đó là ứng dụng dựa trên điều hướng. Mọi bộ điều khiển đều có

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

Bộ điều khiển là con của Bộ điều khiển và nó không tự động xoay. Nếu Xcontroller trở thành một con của Bcontroller thì nó sẽ tự động sửa. Vì vậy, một cái gì đó là sai với Acontroller. Nhưng Acontroller là giống hệt nhau (ngoại trừ dữ liệu của nó) để Bcontroller.

Có gì không ổn?

UPDATE 2:

tôi quyết định tái Acontroller. Và nó làm việc. Tôi tin rằng tôi đã thiếu một cái gì đó ngu ngốc.

+0

Bạn đã thực hiện '-shouldAutorotateToInterfaceOrientation:' như thế nào? – kennytm

+0

- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { trả về CÓ; } Nếu đó là ý của bạn :). – looneygrc

Trả lời

15

Tôi không chắc liệu đó có phải là lý do giống như trường hợp của bạn hay không. Nhưng tôi đã trải nghiệm điều tương tự. shouldAutorotateToInterfaceOrientation chỉ được gọi một lần ngay từ đầu. Sau khi gỡ lỗi nghiêm trọng bằng cách lấy mã, tôi thấy rằng lý do nằm trong phương thức init bị ghi đè của tôi. Tôi có điều này trước:

- (id)initWithAlbum:(PhotoAlbum *)theAlbum { 
    if (self) {  
     self.photoAlbum = theAlbum;  
    } 
    return self; 
} 

Và sau đó tôi đã thay đổi điều này

- (id)initWithAlbum:(PhotoAlbum *)theAlbum { 
    if (self = [super init]) {  
     self.photoAlbum = theAlbum;  
    } 
    return self; 
} 

Lưu ý: sự khác biệt duy nhất là tôi đã thêm [super init] gọi init mẹ. Sau thay đổi này, vòng quay hoạt động tốt và shouldAutorotateToInterfaceOrientation đang được gọi mỗi khi tôi xoay màn hình. Hy vọng sự trợ giúp này.

+1

Hey DaiLak, bạn đã cứu mạng tôi. Tôi đã có cùng một vấn đề như của bạn, và tôi đã phải vật lộn với nó hàng giờ liền. Cảm ơn. –

+0

Nó không hoạt động với tôi –

0
  • (BOOL) shouldAutorotateToInterfaceĐối tượng: (Giao diện UInterfaceOrientation)Đăng ký {return YES; } Phương pháp trên nếu bạn sử dụng, bạn sẽ có thể gọi nhiều lần nếu bạn muốn với bất kỳ lỗi nào.
+0

Tôi đang sử dụng phương pháp này. Và nó chỉ được gọi khi bộ điều khiển tải. – looneygrc

0

Tôi nghĩ rằng không có hành vi lạ ở đây, nó được gọi là chỉ có một trong đó là đúng. Không cần phải gọi nhiều hơn một để quyết định xem thiết bị có nên xoay theo hướng hay không.

Phương pháp này chỉ hỏi xem thiết bị có nên xoay theo hướng hay không. Nếu bạn muốn xử lý sự thay đổi định hướng, bạn nên đăng ký tham gia thông báo từ UIDeviceDidChangeOrientationNotification và ghi đè lên các phương pháp sau đây:

- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && 
    !isShowingLandscapeView) 
    { 
     [self presentModalViewController:self.landscapeViewController 
          animated:YES]; 
     isShowingLandscapeView = YES; 
    } 
    else if (deviceOrientation == UIDeviceOrientationPortrait && 
      isShowingLandscapeView) 
    { 
     [self dismissModalViewControllerAnimated:YES]; 
     isShowingLandscapeView = NO; 
    } 
} 

Xem thêm here.

+0

Cảm ơn câu trả lời của bạn.Nhưng tôi không hiểu tại sao trong các bộ điều khiển khác của tôi nênAutorotateToInterfaceOrientation là đủ để xoay chúng. Và đối với bộ điều khiển cụ thể này là không đủ. Ngoài ra trong các bộ điều khiển khác của tôi mỗi khi tôi xoay thiết bị nênOutorotateToInterfaceOrientation đang được gọi. – looneygrc

+0

Nói cách khác ... bộ điều khiển của tôi nên gọi shouldAutorotateToInterfaceOrientation mỗi lần tôi xoay thiết bị để kiểm tra xem hướng có được hỗ trợ hay không. Vâng ... bộ điều khiển "có vấn đề" của tôi chỉ gọi nó khi nó tải và không khi thiết bị quay. – looneygrc

+0

Khi thiết bị quay, nó sẽ hỏi bộ điều khiển nếu nó hỗ trợ xoay bằng cách truy vấn "shouldAutorotateToInterfaceOrientation:", nếu câu trả lời là có, thì nó sẽ gọi willRotateToInterfaceDuration: duration: để xem liệu nó có cần thực hiện bất kỳ sửa đổi nào khác không. –

2

Ngoài ra, hãy chắc chắn rằng bạn không cần phải xoay khóa trên. Tôi đã dành một giờ tốt cố gắng tìm ra lý do tại sao quan điểm của tôi ngừng quay. shouldAutorotateToInterfaceOrientation chỉ được gọi một lần khi khởi động và khi các bảng thành tích/thành tích của Game Center được trình bày.

3

Tôi đã có cùng một vấn đề - lý do là, đó là UIViewController đầu tiên của tôi, mà tôi đã tạo khi đang di chuyển trong ApplicationDelegate của tôi, thêm nó vào UIWindow của tôi và ngay lập tức phát hành nó.

Đó là tất nhiên không chính xác như tôi vừa thêm UIView của UIViewController (giữ lại nó) và hơn phát hành toàn bộ bộ điều khiển.

Bạn nên thêm UIViewController đầu tiên của mình dưới dạng một biến mẫu trong ApplicationDelegate của bạn thay vào đó và phát hành nó trong phương thức dealloc-phương thức của ApplicationDelegate của bạn.

+0

cảm ơn, điều này đã khắc phục được sự cố của tôi. – ChenXin

5

Apple Q & A có giải pháp chi tiết cho sự cố.

Tại sao bộ điều khiển UIViewController của tôi không thể xoay với thiết bị?

http://developer.apple.com/library/ios/#qa/qa1688/_index.html

Nếu bạn thêm một viewcontroller.view để uiwindow, bạn nên đặt viewController này như rootviewcontroller.

[self.window addSubview: mainViewcontroller.view]; 
self.window.rootViewController=mainViewcontroller; 
0

Tôi có cùng sự cố nhưng với hai bộ điều khiển chế độ xem được thêm vào UIWindow của ứng dụng. Lý do là tài sản UIView Bộ điều khiển xem được nhúng bên trong UIWindow nhưng cùng với một bộ điều khiển xem thêm

Từ Apple kỹ thuật Q & Một

http://developer.apple.com/library/ios/#qa/qa1688/_index.html

1

Trong trường hợp của tôi, ViewController là bên trong một NavigationController được sử dụng bởi chế độ xem "cha mẹ" được kiểm soát đã nhận được các thay đổi định hướng.

Những gì tôi đã làm trong phụ huynh này là:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 

    if(_navigationController){ 
     return [_navigationController.topViewController shouldAutorotateToInterfaceOrientation: toInterfaceOrientation]; 
    } 

    return toInterfaceOrientation == UIInterfaceOrientationPortrait; 
} 

Bằng cách này bạn có thể thực hiện riêng Logic thay đổi hướng của bạn tùy thuộc vào bộ điều khiển hiện nhìn thấy được.

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