如何修改NSLayoutConstraint的multiplier

因為項目用了xib創建cell,里面的控件約束和cell的寬度有關,然而cell在xib的寬度是固定的,只有顯示到屏幕之后才會調整,導致控件布局就不對了,為了實現控件能動態根據cell的寬度調整控件本身的寬度,決定動態修改NSLayoutConstraint的multiplier的值(不知道這個值什么意思的去查閱iOS autolayout公式)。但是multiplier是一個只讀屬性,查找一番之后,成功在stackoverflow找到答案,特意分享出來,給有需要的人。原網站在這里

swift 2.3版本:

import Foundation
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 = self.shouldBeArchived
    newConstraint.identifier = self.identifier

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

swift 3.0版本

import Foundation
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
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容