通过更改约束的乘数值,使UIStackView以不同的方向调整

时间:2016-10-10 10:02:47

标签: ios swift constraints nslayoutconstraint uistackview

让我来描述一下这里的情况。我有两个水平堆栈和一个垂直堆栈。第一个水平堆栈包含两个圆形UIView s,第二个水平堆栈包含一个圆形UIView。我在垂直堆栈中添加了两个水平堆栈,当我运行程序时工作正常,请see the image(纵向模式)以获得清晰的概念。

在横向模式中,我稍微改变了一下,我将第一个水平堆栈的widthAnchor设置为0.67的百分位数,将第二个水平堆栈的widthAnchor设置为百分位数根据显示视图为0.33,并将垂直堆栈轴改为水平。我的想法是,当我将其转换为横向模式时,所有堆栈将适合显示视图并排成一行。它工作正常,请see the image(横向模式)来获得清晰的概念。

但问题是当我再次回到纵向模式时。似乎他们仍然坚持以前的宽度限制。某物 like this

虽然我已经更改了 widthAnchors ,但它们无法正常工作。我在这做错了什么?这是我的代码:

    var firstCircleStack = circleFirstHorizontalStack.widthAnchor.constraint(equalTo: displayView.widthAnchor)
    var secondCircleStack = circleSecondHorizontalStack.widthAnchor.constraint(equalTo: displayView.widthAnchor)

    if UIScreen.main.bounds.height < UIScreen.main.bounds.width {

        // landscape mode
        circleVerticalStack.axis = .horizontal
        firstCircleStack = firstCircleStack.setMultiplier(multiplier: 0.67)
        secondCircleStack = secondCircleStack.setMultiplier(multiplier: 0.33)
    }

    else {

        // portrait mode
        circleVerticalStack.axis = .vertical
        firstCircleStack = firstCircleStack.setMultiplier(multiplier: 1)
        secondCircleStack = secondCircleStack.setMultiplier(multiplier: 1)
    }

设置我使用的乘数值:

extension NSLayoutConstraint {

func setMultiplier(multiplier:CGFloat) -> NSLayoutConstraint {

    let newConstraint = NSLayoutConstraint(
        item: firstItem,
        attribute: firstAttribute,
        relatedBy: relation,
        toItem: secondItem,
        attribute: secondAttribute,
        multiplier: multiplier,
        constant: constant)

    newConstraint.priority = priority
    newConstraint.shouldBeArchived = self.shouldBeArchived
    newConstraint.identifier = self.identifier
    newConstraint.isActive = true
    print("new constraint multiplier \(newConstraint.multiplier)")
    NSLayoutConstraint.deactivate([self])
    NSLayoutConstraint.activate([newConstraint])
    return newConstraint
}

0 个答案:

没有答案