亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以更改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 關注
  • 526 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號