2015-12-07 16 views

Trả lời

6

Bạn đã thử phương pháp viewWillTransitionToSize chưa? Thông báo này được sử dụng để thông báo cho vùng chứa rằng kích thước của chế độ xem của nó sắp thay đổi.

Objective-C

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 

Swift

func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    coordinator.animateAlongsideTransition(nil, completion: { 
    if UIDevice.currentDevice().orientation.isLandscape.boolValue { 
     print("landscape") 
    } else { 
     print("portrait") 
    } 
} 
+0

Có, tôi đã thử. Đó là làm việc. Nhưng tôi muốn nhận được thông báo khi thay đổi kết thúc. Dù sao cũng cảm ơn. – RayChen

+0

Bạn đã thêm séc này vào đó UIDevice.currentDevice(). Orientation.isLandscape.boolValue, điều này sẽ cung cấp cho bạn trạng thái định hướng hiện tại. Tôi đã cập nhật mã với một ví dụ. –

+0

Không, tôi không kiểm tra xem – RayChen

0

Theo tài liệu của UITraitEnvironment:

Hệ thống gọi phương pháp này khi iOS thay đổi môi trường giao diện. Triển khai phương pháp này trong bộ điều khiển chế độ xem và chế độ xem, theo nhu cầu của ứng dụng của bạn, để phản hồi những thay đổi đó. Ví dụ: bạn có thể điều chỉnh bố cục của các bản xem trước của bộ điều khiển chế độ xem khi iPhone được xoay từ hướng dọc sang hướng ngang. Việc triển khai mặc định của phương thức này là trống. Khi bắt đầu triển khai, hãy gọi siêu để đảm bảo rằng các yếu tố giao diện cao hơn trong cấu trúc phân cấp lượt xem có cơ hội điều chỉnh bố cục của chúng trước tiên.

9

Bạn có thể ghi đè traitCollectionDidChange trong số ViewController của mình.

Tuy nhiên.

traitCollectionDidChange được gọi khi bạn thay đổi từ chế độ xem phân chia này sang chế độ xem khác. Ví dụ từ 50/50 xem đến 33/66. Vì vậy, NOT được gọi khi bạn nhập chế độ đa nhiệm hoặc thoát khỏi chế độ đa nhiệm.

Nếu bạn cần phải xử lý tất cả các sự kiện bao gồm xuất nhập cảnh chế độ đa nhiệm, sử dụng viewWillTransitionToSize:withTransitionCoordinator: thay vì:

// put this in your ViewController code  
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
     [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 
     // TODO: put your code here (runs BEFORE transition complete) 
    } 

Nếu bạn muốn mã của bạn được gọi là SAU các compelete chuyển:

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 

    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     // TODO: put your code here (runs AFTER transition complete) 
    }]; 
} 
+3

Chỉ là một gợi ý cho bất cứ ai đọc điều này. 'traitCollectionDidChange' không phải lúc nào cũng được gọi khi bạn thay đổi chế độ chia nhỏ như bạn đã nói" từ 50/50 chế độ xem thành 33/66 ". Nó sẽ chỉ được gọi, nếu lớp kích thước thực tế được thay đổi. Ví dụ. nếu bạn có iPad, không phải iPad chuyên nghiệp và ứng dụng của bạn xuất hiện từ bên phải, traitCollectionDidChange sẽ không được gọi, vì lớp kích thước ở cả hai chế độ sẽ nhỏ gọn. –

+0

Cảm ơn bạn đã bình luận này! Chỉ có Apple mới có thể thực hiện một điều đơn giản nhất (xử lý thay đổi kích thước xem trong trường hợp này) rất phức tạp và không rõ ràng! –

+0

traitCollectionDidChange làm việc tốt cho tôi cho iPad đa nhiệm. – malhal

2

Nếu bất kỳ ai vẫn nghi ngờ đó là điểm:

// This method called every time user changes separator position or when user rotates device 
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    // Always call super in those methods 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    // Before this call your layout is old, status bar orientation will return value before rotation 

    [coordinator animateAlongsideTransition:^(id <UIViewControllerTransitionCoordinatorContext> context) { 
     // Code here will be executed during transform. Status bar orientation is new, your view size already changed (in general). 
     // Setup required animations or custom views transitions 
    } 
    completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     // Split view transition complete or device rotated 
    }]; 
} 

Ngoài ra còn có phương thức traitCollectionDidChange:, nhưng nó sẽ chỉ được gọi khi lớp kích thước ngang thực sự thay đổi. Ví dụ: nếu ứng dụng của bạn hiển thị từ bên phải trong chế độ xem chia tách, traitCollectionDidChange: sẽ không được gọi khi người dùng thay đổi vị trí dấu phân cách. Nhưng nếu ứng dụng của bạn trình bày từ trái, nó sẽ được gọi là luôn luôn ở chế độ dọc và theo chiều ngang để chuyển (50/50) <-> (66/33)

0

Theo quan điểm điều khiển, chúng ta nên gọi

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {

để có được thông báo khi có định hướng/thay đổi chế độ xem nhiều cửa sổ.

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