为了账号安全,请及时绑定邮箱和手机立即绑定

我可以更改NSLayoutConstraint的multiplier属性吗?

我可以更改NSLayoutConstraint的multiplier属性吗?

iOS
噜噜哒 2019-12-12 14:10:27
我在一个超级视图中创建了两个视图,然后在视图之间添加了约束:_indicatorConstrainWidth = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f];[_indicatorConstrainWidth setPriority:UILayoutPriorityDefaultLow];_indicatorConstrainHeight = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];[_indicatorConstrainHeight setPriority:UILayoutPriorityDefaultLow];[self addConstraint:_indicatorConstrainWidth];[self addConstraint:_indicatorConstrainHeight];现在,我想用动画更改乘子属性,但是我不知道如何更改乘子属性。(我在头文件NSLayoutConstraint.h的私有属性中找到了_coefficient,但它是私有的。)如何更改多重属性?我的解决方法是删除旧的约束,并为添加新的约束multipler。
查看完整描述

3 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

这是Swift中的NSLayoutConstraint扩展,可以轻松设置新的乘数:


import UIKit


extension NSLayoutConstraint {


    func setMultiplier(multiplier:CGFloat) -> NSLayoutConstraint {


        NSLayoutConstraint.deactivateConstraints([self])


        let newConstraint = NSLayoutConstraint(

            item: firstItem,

            attribute: firstAttribute,

            relatedBy: relation,

            toItem: secondItem,

            attribute: secondAttribute,

            multiplier: multiplier,

            constant: constant)


        newConstraint.priority = priority

        newConstraint.shouldBeArchived = shouldBeArchived

        newConstraint.identifier = identifier


        NSLayoutConstraint.activateConstraints([newConstraint])

        return newConstraint

    }

}

在Swift 3.0中


import UIKit

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

    }

}

演示用法:


@IBOutlet weak var myDemoConstraint:NSLayoutConstraint!


override func viewDidLoad() {

    let newMultiplier:CGFloat = 0.80

    myDemoConstraint = myDemoConstraint.setMultiplier(newMultiplier)


    //If later in view lifecycle, you may need to call view.layoutIfNeeded() 

}



查看完整回答
反对 回复 2019-12-13
?
PIPIONE

TA贡献1829条经验 获得超9个赞

我用来更改现有布局约束的乘数的辅助函数。它创建并激活了一个新的约束,并停用了旧的约束。


struct MyConstraint {

  static func changeMultiplier(_ constraint: NSLayoutConstraint, multiplier: CGFloat) -> NSLayoutConstraint {

    let newConstraint = NSLayoutConstraint(

      item: constraint.firstItem,

      attribute: constraint.firstAttribute,

      relatedBy: constraint.relation,

      toItem: constraint.secondItem,

      attribute: constraint.secondAttribute,

      multiplier: multiplier,

      constant: constraint.constant)


    newConstraint.priority = constraint.priority


    NSLayoutConstraint.deactivate([constraint])

    NSLayoutConstraint.activate([newConstraint])


    return newConstraint

  }

}

用法,将乘数更改为1.2:


constraint = MyConstraint.changeMultiplier(constraint, multiplier: 1.2)



查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 461 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信