簡體   English   中英

如何以編程方式更改錨定樣式約束?

[英]How to change Anchor-Style Constraint programmatically?

我進行了搜索,甚至提出了潛在的解決方案。 可悲的是,他們都沒有話。我試圖通過增加View的leadAnchor-Constraint來使其動畫化。

我這樣創建約束:

let margins = self.layoutMarginsGuide
    horizontalConstraint = underline.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)

然后編輯約束常量,如下所示:

func updateUnderlinePosition(offset:CGFloat, pageCount:Int) {

    //Underline just over width of one Screen:
    var underlineOffset = offset / CGFloat(pageCount)

    //Add left margin:
    let margins = self.layoutMarginsGuide
    underlineOffset += 15

    //reposition underlineview
    horizontalConstraint.constant += underlineOffset
    self.layoutIfNeeded()
}

為什么我會錯誤地告訴我約束存在沖突?

"<NSLayoutConstraint:0x7fca2b8c72c0 UIView:0x7fca29d1c830.leading == UILayoutGuide:0x7fca2b8c4970'UIViewLayoutMarginsGuide'.leading>",
"<NSLayoutConstraint:0x7fca29c2ccd0 UIView:0x7fca29d1c830.leading == UILayoutGuide:0x7fca2b8c4970'UIViewLayoutMarginsGuide'.leading + 16.25>"

編輯:

約束是這樣創建的:

override func layoutSubviews() {
    super.layoutSubviews()

    //underline.frame = CGRectMake(15, self.frame.height-10, 40, 2)
    underline.translatesAutoresizingMaskIntoConstraints = false
    underline.backgroundColor = UIColor.whiteColor()
    underline.layer.cornerRadius = 1.0
    self.addSubview(underline)
    print(self.backItem)
    let margins = self.layoutMarginsGuide
    horizontalConstraint = underline.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)
    let verticalConstraint = underline.centerYAnchor.constraintEqualToAnchor(margins.bottomAnchor)
    let widthConstraint = underline.widthAnchor.constraintEqualToAnchor(nil, constant: 40)
    let heightConstraint = underline.heightAnchor.constraintEqualToAnchor(nil, constant: 2)
    NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
}

檢查layoutSubviews是否被調用兩次

問題是您要在layoutSubviews中添加約束,可以多次調用該約束。 您一次實例化underline ,但是可以多次調用layoutSubviews ,引用underline的同一實例,從而在此過程中丟失了對原始horizontalConstraint引用。

坦白說,添加子視圖和約束並不真正屬於layoutSubviews 您應該在實例化underline視圖的地方設置約束,可以在適當的視圖init方法或awakeFromNIB進行約束。 這取決於如何實例化視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM