ios - 我可以更改 NSLayoutConstraint 的乘数属性吗?

我在一个superview中创建了两个view,然后在view之间添加了约束:

_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 的私有(private)属性中找到了 _coefficient,但它是私有(private)的。)

如何更改多重属性?

我的解决方法是删除旧约束并为 multipler 添加具有不同值的新约束。

最佳答案

这是 Swift 中的一个 NSLayoutConstraint 扩展,它可以很容易地设置一个新的乘数:

在 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() 
}

https://stackoverflow.com/questions/19593641/

相关文章:

objective-c - 是否可以在 Obj-C 中使用 Swift 的枚举?

ios - 如何以简单的方式将 CGPoint 对象添加到 NSArray?

objective-c - 在 Objective-C 中加入一个数组

iphone - 如何使用可选方法创建协议(protocol)?

ios - 如何在 View 出现之前滚动到 iPhone 上 UITableView 的底部

ios - 模仿Facebook隐藏/显示扩展/收缩导航栏

ios - UITableViewCell 分隔符在 iOS7 中消失

iphone - 如何处理包含属性的 Objective-C 协议(protocol)?

objective-c - xcode4中框架和静态库的区别,以及如何调用它们

ios - 不推荐使用旋转方法,相当于 'didRotateFromInterfaceOrienta