【问题标题】:Where to add view for specific size class (programmatically)在哪里添加特定尺寸类的视图(以编程方式)
【发布时间】:2018-05-16 07:34:13
【问题描述】:

可能发生的一个常见用例是需要为特定尺寸类添加视图。 例如,wRegular。

我们可能想添加一个额外的标签以利用额外的空间。

我的问题是我应该在哪里添加这个标签,更具体地说,我们应该在下面的方法中将这个标签添加到我们的视图中吗?

traitCollectionDidChange


我正在考虑做类似的事情

// sudo code
traitCollectionDidChange{

    if (wR){
        create special view if special view is nil 
        self.view.addChildView(special View) 
        set constraints for wRegular size class

     } else{
        self.view.removeChildView(special View) 
        deactivate special view constraints (if not nil)
        set constraints for ... size class 

     }
}

似乎有大量关于如何在界面构建器中执行此操作的示例,但我不确定我们将在哪里实际初始化额外视图。

我在traitCollectionDidChange 中初始化了特殊视图,因为我们可能有一个永远不需要特殊视图的设备。

【问题讨论】:

    标签: ios size-classes adaptive-layout


    【解决方案1】:

    不要每次都添加和删除视图。只添加一次。只需根据 traitCollectionDidChange 中的 trait 激活和停用约束,如下代码。

       if self.traitCollection.horizontalSizeClass == .compact {
         NSLayoutConstraint.activate(horConstraintsArray)
         NSLayoutConstraint.deactivate(vertConstraintsArray)
       } else {
         NSLayoutConstraint.activate(vertConstraintsArray)
         NSLayoutConstraint.deactivate(horConstraintsArray)
       }
    

    此外,根据您在 else 部分中编写的代码,如果删除了视图,则会自动删除约束。当您旋转设备、创建和添加视图时,每次都添加约束是一项代价高昂的任务。

    【讨论】:

    • 如果我们从常规宽度移动到紧凑宽度会怎样。在这种情况下,不需要我们添加的视图。在这种情况下我们不需要删除它吗?注意:我不是每次都创建视图,只是将其从主视图中删除。
    • 一个简单的例子是苹果计算器应用程序。旋转视图,您将看到它们如何添加新按钮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多