我正致力于采用多任务来支持应用的拆分视图。但我发现app在右边时没有调用traitCollectionDidChange。有没有人对此有所了解?
答案 0 :(得分:9)
您可以覆盖traitCollectionDidChange
中的ViewController
。
<强>然而强>
从一种拆分视图模式切换到另一种拆分视图模式时, traitCollectionDidChange
被调用。例如从50/50视图到33/66。当您进入多任务模式或退出时,它会被 NOT 调用。
如果您需要处理所有活动,包括进入和退出多任务模式,请改为使用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)
}
如果您希望代码名为 AFTER ,请转换竞争对手:
-(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)
}];
}
答案 1 :(得分:8)
您是否尝试过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")
}
}
答案 2 :(得分:2)
如果有人仍然怀疑这一点:
// 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)
答案 3 :(得分:1)
在视图控制器中,我们应该调用
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
在方向/多窗口视图更改时收到通知。
答案 4 :(得分:0)
根据UITraitEnvironment的文档:
当iOS界面环境发生变化时,系统会调用此方法。根据应用程序的需要在视图控制器和视图中实现此方法,以响应此类更改。例如,当iPhone从纵向旋转到横向时,您可以调整视图控制器的子视图的布局。此方法的默认实现为空。 在实现开始时,调用super以确保视图层次结构中较高的接口元素有机会首先调整其布局。