iPad多任务处理根据故事板中的自动布局激活/停用约束

时间:2018-02-27 14:41:08

标签: ios ipad autolayout multitasking

在应用程序运行时期间,我有时会更改故事板中设置的某些约束的active属性以隐藏/显示某些视图。

一切正常但如果app从一种尺寸转换到另一种尺寸(例如,当用户在iPad splitview上调整应用程序大小(屏幕上有两个应用程序)时更改特征),所有约束都会从故事板返回到初始状态。 (当应用程序占用屏幕的一半并调整大小以占用屏幕的50%以上时会发生。iOS 11)

E.g。如果在故事板中约束是活动的,稍后在运行时,我将其停用,在拉伸应用程序后(当应用程序是iPad上的splitview的一部分时),它会再次激活。

是错误还是功能?如何防止这种情况发生?再次激活/停用这些约束的最佳回调方法是什么?

2 个答案:

答案 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委托对象。

我还发现了以下一点

  

通过实施方法回应特征收集和大小变化   在UITraitEnvironmentUIContentContainer协议中。

当用户尝试更改大小时,您将触发的方法

我建议仔细阅读该文件,了解更多详情。