Tôi đang làm việc trên một ứng dụng đa nhiệm để hỗ trợ chế độ xem chia nhỏ cho ứng dụng. Nhưng tôi thấy traitCollectionDidChange không được gọi khi ứng dụng ở bên phải. Có ai có ý tưởng về điều này?traitCollectionDidChange không được gọi khi đa nhiệm
Trả lời
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")
}
}
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.
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)
}];
}
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. –
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! –
traitCollectionDidChange làm việc tốt cho tôi cho iPad đa nhiệm. – malhal
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)
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ổ.
- 1. Nhiệm vụ cào đa luồng
- 2. Thanh công cụ đang hoạt hình khi đa nhiệm
- 3. "didChangeSection:" NSfetchedResultsController phương thức ủy nhiệm không được gọi là
- 4. alertViewShouldEnableFirstOtherButton phương thức ủy nhiệm không được gọi là
- 5. Sự kiện đa nhiệm sự kiện/nhiệm vụ C++
- 6. Grunt đa nhiệm vụ ném lỗi EISDIR khi xây dựng
- 7. Trình hủy có được gọi khi một nhà xây dựng ủy nhiệm ném không?
- 8. NSTimer nhiệm vụ tuần hoàn không được gọi trong khi di chuyển
- 9. iPad - Cách phát hiện cử chỉ đa nhiệm được bật?
- 10. Nhiệm vụ tối đa trong TPL?
- 11. Grunt: Làm thế nào để soạn hai đa nhiệm như một plugin đa nhiệm khác?
- 12. Golang - Hành vi đa nhiệm không mong đợi
- 13. iAd không hiển thị không đồng bộ khi phương thức ủy nhiệm của nó được gọi là
- 14. Các quyền đa nhiệm của Azure AD
- 15. Chạy một nhiệm vụ sau khi tất cả các nhiệm vụ đã được hoàn thành
- 16. MKMapView không gọi các phương thức ủy nhiệm
- 17. nhân cần tây không thử lại nhiệm vụ sau khi gọi retry()
- 18. Tránh gọi lại hoàn thành nhiệm vụ được gọi quá nhiều lần?
- 19. Tại sao GetType() không thể tìm thấy kiểu khi được gọi thông qua một ủy nhiệm nhóm phương thức?
- 20. ngOnInit không được gọi sau khi router.navigate
- 21. onPrepareActionMode không được gọi khi tạo ActionMode
- 22. onServiceDisconnected() không được gọi sau khi gọi Dịch vụ stopSelf()
- 23. Phương thức ủy nhiệm xoay vòng thiết bị UIViewController không được gọi trong iOS8
- 24. C# P/Gọi: Varargs ủy nhiệm gọi lại
- 25. Khi __repr __() được gọi?
- 26. C# ủy nhiệm cho gọi lại C++
- 27. Đa nhiệm trên iOS cho ứng dụng Ghi âm thanh
- 28. Tại sao một lớp học được gọi là "được gọi" khi không được bắt đầu? - Python
- 29. Chạy nhiệm vụ cần tây khi không thể nhập nhiệm vụ
- 30. onConfigurationChanged không được gọi khi setRequestedConfiguration đã được sử dụng
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
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ụ. –
Không, tôi không kiểm tra xem – RayChen