【问题标题】:iPad multitasking activate/deactivate constraints according to autolayout in storyboardiPad多任务根据情节提要中的自动布局激活/停用约束
【发布时间】:2018-08-07 06:06:17
【问题描述】:

在应用运行时,我有时会更改情节提要中设置的某些约束的 active 属性以隐藏/显示某些视图。

一切正常,但如果应用程序从一种尺寸转换到另一种尺寸(改变特征,例如当用户在 iPad 拆分视图(屏幕上的两个应用程序)上调整应用程序的大小时),所有约束都会从情节提要返回到它们的初始状态。 (当应用占据屏幕的一半并调整大小以占据屏幕的 50% 以上时发生。iOS 11)

例如如果在情节提要中约束处于活动状态,并且稍后在运行时,我会停用它,在拉伸应用程序后(当应用程序是 iPad 上 splitview 的一部分时)它会再次激活。

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

【问题讨论】:

  • 检查下面的答案答案中的链接应该会给你更多关于这种实现的细节
  • @HarshalBhavsar 谢谢,现在我找到了更好的解决方案。

标签: ios ipad autolayout multitasking


【解决方案1】:

如果您可以选择在代码中而不是在情节提要中创建这些可修改的约束,我认为这是最好的解决方案。如果没有,请使用以下方法。


我决定在我的视图控制器中使用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
    }
}

【讨论】:

    【解决方案2】:

    根据苹果的以下文件

    Adopting Multitasking Enhancements on iPad

    当用户移动分隔线时,系统会使用applicationWillResignActive: 协议方法调用您的应用委托对象。

    我还发现了一点如下

    通过实现方法来响应 trait 集合和大小的变化 在UITraitEnvironmentUIContentContainer 协议中。

    是当用户尝试更改大小时触发的方法

    我建议您阅读文档以了解更多详细信息。

    【讨论】:

    • 感谢尝试)我认为在这种情况下使用 applicationWillResignActive: 是一个糟糕的设计,因为此回调与大小类更改无关,并且每次用户获得系统对话框或离开时都会调用应用程序。
    • 在回答中添加了更多数据,请检查
    • 谢谢,我已经这样解决了问题,看我的回答
    • 很高兴您得到了解决方案
    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2015-06-17
    • 2015-02-14
    相关资源
    最近更新 更多