我正在采用多任务来支持应用程序的拆分视图。但我发现应用程序在右侧时不会调用traitCollectionDidChange。有没有人有这个想法?traitsCollectionDidChange多任务时不调用
回答
您是否尝试过viewWillTransitionToSize方法?这用于通知容器其视图的大小即将更改。
目标C
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
夫特
func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animateAlongsideTransition(nil, completion: {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("landscape")
} else {
print("portrait")
}
}
作为每UITraitEnvironment文档:
的系统调用这个方法的IOS接口上环境的变化时。根据您的应用程序的需求,在视图控制器和视图中实施此方法,以响应此类更改。例如,当iPhone从纵向旋转到横向时,您可以调整视图控制器子视图的布局。此方法的默认实现为空。 在实施开始时,请调用super以确保视图层次结构中较高的界面元素有机会首先调整其布局。
您可以在您的ViewController
中覆盖traitCollectionDidChange
。
但是,
traitCollectionDidChange
当您从一种拆分视图模式更改为另一种拆分视图模式时调用。例如从50/50查看到33/66。当您进入多任务模式或退出时,它会调用而不是。
如果您需要处理所有包括进入和退出多任务模式下的事件,使用viewWillTransitionToSize:withTransitionCoordinator:
代替:
// 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)
}
如果你希望你的代码中调用后过渡compelete:
-(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)
}];
}
只是提示谁读这个。当您像“你从50/50视图到33/66”那样改变分割模式时,并不总是调用“traitCollectionDidChange”。如果实际尺寸等级发生变化,它将被调用。例如。如果您有iPad,而不是iPad Pro,并且您的应用程序是从右侧出现的,则不会调用traitCollectionDidChange,因为两种模式下的大小类都是Compact。 –
谢谢你的评论!只有苹果公司可以做出最简单的事情(在这种情况下处理视图尺寸变化)如此复杂和不清楚! –
traitCollectionDidChange适用于iPad,适用于多任务处理。 – malhal
如果有人仍然怀疑这是重点:
// 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
}];
}
还有一种方法traitCollectionDidChange:
,但只有在水平尺寸类实际更改时才会调用它。例如,如果您的应用在分割视图模式下从右侧出现,traitCollectionDidChange:
将不会在用户更改分隔符位置时调用。但是,如果离开了您的应用展示,将始终称为人像模式,在景观的过渡(50/50) <-> (66/33)
在视图控制器,我们应该叫
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
得到通知时,定向/多窗口视图更改。
- 1. 调用多个任务
- 2. Java多线程 - 每次任务完成任务时调度任务
- 3. AlarmManager不调用任务?
- 4. JSHint预期多任务的任务或函数调用
- 5. 完成多个任务后如何调用一个任务
- 6. 从capistrano任务中调用多级capistrano任务
- 7. 如何多次调用Thor任务?
- 8. 使用newSingleThreadScheduledExecutor调度多任务
- 9. Grunt - 任务不支持多任务?
- 10. 任务时间多任务都有自己的任务
- 11. 在jboss 5.0.1上运行spring任务调度程序的多任务调用GA
- 12. Rails中的多时区任务调度(每当使用)
- 13. 一个任务在多次调用时抛出AggregateException
- 14. 调用rake任务
- 15. Vb.Net - 调用任务
- 16. NSURLSession后台任务:何时调用handleEventsForBackgroundURLSession:completionHandler?
- 17. 当调用onDestroy()时运行长任务
- 18. 从asynch任务调用runonuithread任务
- 19. 从任务调用另一个任务
- 20. 多春@Scheduled任务同时
- 21. 使用pyspark的Celery任务的Flask API不能同时运行多个任务
- 22. 做任务让用户知道任务完成时的多个任务
- 23. 任务调度程序可以同时运行多少个任务
- 24. 不要调用外部JavaScript任务的Grunt任务
- 25. 不知道如何建立任务 - 为调用其他任务
- 26. 启用多任务
- 27. 当通过Windows任务调度程序调用SSIS包时,发送邮件任务在SSIS中不起作用
- 28. 异步任务..不能调用executeOnExecutor()
- 29. 我定期任务不会被调用
- 30. 多任务与单任务
是的,我试过了。这很奏效。但是我想在更改结束时收到通知。不管怎样,谢谢。 – RayChen
你在这里添加了这个检查UIDevice.currentDevice()。orientation.isLandscape.boolValue,这会给你当前的方向状态。我用一个例子更新了代码。 –
不,我没有检查 – RayChen