在应用程序运行时期间,我有时会更改故事板中设置的某些约束的active
属性以隐藏/显示某些视图。
一切正常但如果app从一种尺寸转换到另一种尺寸(例如,当用户在iPad splitview上调整应用程序大小(屏幕上有两个应用程序)时更改特征),所有约束都会从故事板返回到初始状态。 (当应用程序占用屏幕的一半并调整大小以占用屏幕的50%以上时会发生。iOS 11)
E.g。如果在故事板中约束是活动的,稍后在运行时,我将其停用,在拉伸应用程序后(当应用程序是iPad上的splitview的一部分时),它会再次激活。
是错误还是功能?如何防止这种情况发生?再次激活/停用这些约束的最佳回调方法是什么?
答案 0 :(得分:2)
如果你可以选择在代码中而不是在故事板中创建那些可修改的约束,我认为它是最好的解决方案。如果没有,请使用以下方法。
我决定在我的视图控制器中使用traitCollectionDidChange:
方法。在调用此方法时,约束不会更改,因此我创建了一个标记,该标记将在特征集合更改后调用的viewDidLayoutSubviews
方法中使用。
调用viewDidLayoutSubviews
时,约束已经更改,因此我们可以根据需要重新配置它们。
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
if (previousTraitCollection) _traitsCollectionDidChange = YES;
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
if (_traitsCollectionDidChange) {
_traitsCollectionDidChange = NO;
// reconfigure your constraints
}
}
答案 1 :(得分:0)
根据苹果的以下文件
Adopting Multitasking Enhancements on iPad
当用户移动分隔符时,系统使用applicationWillResignActive:
协议方法调用您的app委托对象。
我还发现了以下一点
通过实施方法回应特征收集和大小变化 在
UITraitEnvironment
和UIContentContainer
协议中。
当用户尝试更改大小时,您将触发的方法
我建议仔细阅读该文件,了解更多详情。