2014-09-19 21 views
32

willAnimateRotationToInterfaceOrientation:duration:deprecated trong iOS8, bạn cần sử dụng viewWillTransitionToSize:withTransitionCoordinator:instead.Phương thức xoay giao diện iOS8 không được gọi là

Tuy nhiên, phương pháp này không được gọi trong điều khiển điểm của tôi trên iOS8. Có điều gì khác, tôi cần triển khai, để gọi lại này hoạt động không?

tôi không thể tìm thấy bất cứ điều gì trong tài liệu. Điều duy nhất tôi có thể tìm thấy, là nó thuộc về giao thức UIContentContainer mới. Tuy nhiên, ngay cả khi tôi thêm điều này vào giao thức của bộ điều khiển của tôi một cách rõ ràng, nó không hoạt động.

Bất kỳ ý tưởng nào?

+0

tôi đã tải viewController của tôi như là một cái nhìn cho các nút phân đoạn. Trong trường hợp này tôi đã không nhận được viewWillTransitionToSize: withTransitionCoordinator: được gọi. Bạn đang cố gắng tải viewController như thế nào? – Surendra

Trả lời

37

Các viewWillTransitionToSize:withTransitionCoordinator: dường như chỉ làm việc nếu giao diện được thực sự sẽ thay đổi kích thước, có nghĩa là chúng tôi đã xoay 90 độ. Nếu bạn có một mặt nạ trên bố trí của bạn mà chỉ cho phép cảnh quan, khi xoay 180 độ, kích thước giao diện không thay đổi, do đó, phương pháp này dường như không được gọi.

Tôi đã làm việc xung quanh này trong ứng dụng của mình bằng cách thay vì đăng ký vào UIDeviceOrientationDidChangeNotification thông báo như sau:

(Theo quan điểm điều khiển của tôi viewWillAppear):

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil]; 
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

(An của tôi viewWillDisappear [nhớ để bỏ đăng ký])

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; 

My deviceOrientationDidChange: trông giống như:

- (void)deviceOrientationDidChange:(NSNotification *)notification { 
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    [self willRotateToInterfaceOrientation:orientation duration:1.0]; 
} 
+0

cách giải quyết này cũng có tác dụng đối với tôi và có vẻ là giải thích tốt nhất cho đến nay – tschubotz

+0

đã làm việc cho tôi để giải quyết vấn đề xoay vòng với iOS8 ..! nhiều thnx –

+26

Thật là một sự phản đối vô lý từ Apple .. – Sti

33

Theo docs, hãy nhớ gọi super

- (void)viewWillTransitionToSize:(CGSize)size 
     withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    // ... 
} 

Nếu không xem đứa trẻ điều khiển sẽ không nhận được thông điệp chuyển tiếp tới họ.

+0

Mặc dù đây là một gợi ý hữu ích nhưng có lẽ tôi đã bỏ lỡ cách trả lời câu hỏi gốc ...? – yura

+0

Cảm ơn bạn, Trong trường hợp của tôi: Tôi bỏ lỡ cuộc gọi thêm childViewController. : D –

+0

@yura nếu một lớp khác nhận được tin nhắn và không chuyển tiếp cuộc gọi đó với cuộc gọi tới siêu hạng, lớp bạn đang làm việc có thể không nhận được. – arlomedia

7

Tôi biết câu hỏi này hơi cũ tại thời điểm này nhưng tôi nghĩ rằng vấn đề có thể được giải quyết theo một cách khác cho một số người có thể gặp phải vấn đề này. Nếu bạn đang cố gắng tải một khung nhìn là một phần của bộ điều khiển DIFFERENT bằng cách sử dụng addSubview(controller.view), bạn cũng cần phải thêm bộ điều khiển đó cho cha mẹ (có thể là khung nhìn bạn đang thêm vào bộ điều khiển). Nếu bạn không thêm bộ điều khiển cho phụ huynh, bạn sẽ không bao giờ nhận được bản cập nhật cho các thay đổi kích thước. Sau đó chúng tôi phát hiện ra lý do thay đổi API của Apple; với iPad pro, SizeClass của bạn có thể thay đổi mà không cần xoay vòng với khả năng đa tác vụ. Điều này cũng sẽ gọi phương thức:

viewWillTransitionToSize(size: CGSize, 
     withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 

Trong lớp cha mẹ, hãy chắc chắn bạn cũng gọi siêu hoặc bạn sẽ tìm cách khác để đánh đầu vào tường ...

+0

Tuyệt vời ... đã khắc phục được sự cố của tôi. Tôi đã không gọi siêu, và phương pháp này đã không được gọi. Bắt đầu gọi siêu, và pow ... bắt đầu làm việc. –

+0

+1 cho: - Nếu bạn đang cố gắng tải chế độ xem là một phần của bộ điều khiển KHÁC bằng cách sử dụng addSubview (controller.view), bạn cũng cần phải thêm bộ điều khiển đó vào cha mẹ (có thể chế độ xem bạn đang thêm vào điều khiển). Nếu bạn không thêm bộ điều khiển cho phụ huynh, bạn sẽ không bao giờ nhận được bản cập nhật cho các thay đổi kích thước. – paran

+0

Cảm ơn rất nhiều vì điều này !. Tôi đã không nhận thấy rằng trong quan điểm cha mẹ của tôi (đối với hầu hết các ứng dụng của tôi) tôi đã không gọi siêu trên nó, do đó không có quan điểm con nơi thực hiện các phương pháp này. –

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