以编程方式修改约束Swift

时间:2016-03-14 10:21:49

标签: ios swift nslayoutconstraint

我的故事板中有以下视图控制器:

storyboard_mainVC

默认情况下,它总是有6个图像视图,宽度和高度相等。每个图像视图都被约束到超级视图:"相等的高度"乘数为1/2。

然而,在我加载图像之前,我读了一个属性,它给了我一个图像所需的高度(宽度永远不会被修改)。

所以我的界面(在运行时)看起来像这样:

second_interface

我想我需要修改乘数常数,但它是只读

我看到帖子说我们可以更新约束的常量属性,但它是分数,我需要它才能在每个设备上运行。

现在你会推荐什么?我应该删除约束并添加一个新约束吗?如果我不删除它并尝试应用新的高度限制,它是否会自动删除?

我是否必须使用像snapkit这样的pod来完成这项工作?

感谢您的帮助。

修改

这是我尝试的代码,但没有成功:

        for (index, (drawing, ratio)) in drawingElements.enumerate() {
            drawingViews[index].image = UIImage(named: drawing)
            // update height constraint if ratio is different than defaut ratio of 1/2
            if ratio != 0.5 {
                heightConstraints[index].active = false
                let newHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.Height, multiplier: ratio, constant: 0)
                drawingViews[index].addConstraint(newHeightConstraint)
                self.view.layoutIfNeeded()
            }
        }

我做错了吗?我不确定新的高度限制,但

3 个答案:

答案 0 :(得分:8)

所以这就是我实现这个目标的方式:

  • 以编程方式创建约束(在我的情况下为高度):

    // Drawing height property
    var drawingHeightConstraint: NSLayoutConstraint?
    
  • 停用旧约束并根据需要设置新约束

注意:heightContraints是NSLayoutConstraint的数组,其中包含我的出口

        for (index, (drawing, ratio)) in drawingElements.enumerate() {
        drawingViews[index].image = UIImage(named: drawing)

        // update height constraint if ratio is different than defaut ratio of 1/2
        if ratio != 0.5 {
            heightConstraints[index].active = false
            drawingHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: .Height, relatedBy: .Equal, toItem: drawingView, attribute: .Height, multiplier: CGFloat(ratio), constant: 0)
            drawingHeightConstraint!.active = true
        }

    }
  • 紧接着调用layoutIfNeeded()(注意:不确定何时调用它)

答案 1 :(得分:5)

约束常量与受约束元素的内容相关。 这就是为什么你得到这样的屏幕。最简单的方法 - 创建具有清晰颜色的图像并默认设置它。下载完成后,只需为您的imageView设置新图像

或者您可以为您的身高限制设置IBOutlet - 并针对不同情况更改其值 即。

#

答案 2 :(得分:0)

由于我不知道的原因(可能是某种Apple的实现细节),您无法更改乘数。但是,您可以删除约束并创建新约束。您必须删除旧约束,因为它不会自动删除,并且您将遇到冲突。或者,您可以创建具有较低优先级的第一个约束(具有0.5乘数)。这样你可以保留它(自动布局会忽略它),但我认为这不是一种方法,因为你为什么需要这种不必要的约束?只需删除它。 至于第三方布局引擎和库 - 遗憾的是,我不能在这里给你任何建议。