在应用程序运行时,我有时会更改故事板中设置的某些约束的 active
属性,以隐藏/显示一些视图。
一切正常,但是如果应用程序从一个大小到另一个大小过渡(例如,在iPad splitview(屏幕上的两个应用程序(上调整应用程序的应用程序大小时,都会更改特征(所有约束从故事表中返回到其初始状态。(当应用程序占屏幕的一半并进行调整以占屏幕的50%以上时,发生。IOS11(
(例如。如果在故事板中,约束是活动的,然后在运行时稍后,我将其停用,在拉伸应用程序之后(当应用程序是iPad上的splitview的一部分时(,它将再次激活。
是错误还是功能?如何防止这种情况发生?再次激活/停用这些约束的最佳回调方法是什么?
如果您可以选择在代码中创建这些可修改的约束,而不是在故事板内创建这些可修改的约束,我认为这是最好的解决方案。如果不是,请使用下面的方法。
我决定在视图控制器内使用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
}
}
根据以下文档
在iPad上采用多任务增强功能
用户移动分隔线时,系统将使用applicationWillResignActive:
协议方法调用您的应用程序委托对象。
我还发现了一个点,如下所示
通过实施方法来响应特质收集和大小的变化 在
UITraitEnvironment
和UIContentContainer
协议中。
是用户尝试更改大小
时将触发的方法我建议通过文档以获取有关此的更多详细信息。