为什么通过编程设置我的宽高比约束时未激活?

时间:2018-10-29 10:03:16

标签: ios autolayout

我将我的问题简化为就像ViewController上的UIView一样,如下图所示:

enter image description here

我将纵横比约束从情节提要板拖到ViewController代码中,并命名为aspectRatioConstraint

我希望运行应用程序时紫色视图的宽高比为1:1,因此在viewDidLoad中我设置了aspectRatioConstraint.constant = 1(在运行宽高比之前为343:128)

但是当我运行应用程序时什么也没发生。宽高比未更改为1:1,这是怎么了?

3 个答案:

答案 0 :(得分:1)

由于multiplayer是仅获取属性,因此我们无法更改其值,而可以更改constant属性。

open var multiplier: CGFloat { get }

从约束菜单中:

enter image description here

  

第一项=(乘数*第二项)+常量

     

View.Height =((128/343)* View.Width)+ 0

换句话说,343 = (0.373 * 128) + x

由于乘数必须从0.373更改为1

(View.Height - constant) / View.width = Multiplier

(343-x)/ 128 = 1

x = 343-128

x = 215

aspectRatioConstraint.constant = 215
yourView.layoutIfNeeded()

答案 1 :(得分:1)

如前所述,长宽比实际上是约束的Multiplier ...,这是一个“仅获取”属性。

您可以使用NSLayoutConstraint扩展名来更改乘数(在此处找到:https://stackoverflow.com/a/33003217/6257435):

extension NSLayoutConstraint {
    /**
     Change multiplier constraint

     - parameter multiplier: CGFloat
     - returns: NSLayoutConstraint
    */
    func setMultiplier(multiplier:CGFloat) -> NSLayoutConstraint {

        NSLayoutConstraint.deactivate([self])

        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

        NSLayoutConstraint.activate([newConstraint])
        return newConstraint
    }
}

现在,您可以在viewDidLoad()中致电:

aspectRatioConstraint = aspectRatioConstraint.setMultiplier(multiplier: 1.0)

答案 2 :(得分:0)

需要在更改视图约束常量之前和之后集成self.view.layoutIfNeeded()。