2016-09-30 45 views
0

我以編程方式使用自動佈局約束,我想重新設置基於其更改標題的按鈕寬度。假設我沒有參考已設置的舊寬度約束,我怎樣才能重新調整其寬度?在我看來,創建一個新的寬度約束不起作用 - 我需要停用舊的寬度約束,然後激活新約束。但我沒有提到舊的。UIButton的重建寬度

// adding a new constraint 
myButton.widthAnchor.constraintEqualToConstant(myNewWidth).active = true 
+0

爲什麼你沒有對舊寬度約束的引用?默認情況下,按鈕寬度將擁抱它的內容,所以也許你甚至不需要寬度約束。設置水平中心,也許最大寬度 – Paulw11

+0

我試圖寫一個重構參數的通用方法,在這種情況下是一個UIButton。很高興能夠查詢錨點上的所有約束。 – andrewz

回答

1

在你的類中創建一個NSLayoutConstraint屬性。當您以編程方式設置按鈕的寬度約束時,將此屬性指定爲新約束。

然後,當你需要更新約束只是這樣做

myWidthConstraint.constant = newValue 
+1

我同意保持對約束的引用是有用的,但是例如對於在寬度錨點上查詢約束將是優選的。 – andrewz

1

你可以試試這個。我還沒有嘗試過。首先,您需要過濾一堆約束或全部循環並找到所需的約束。爲此你可以使用它。

var constraint: NSLayoutConstraint! = nil 
let constraints = myButton.constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Horizontal) 

或這會得到你的所有約束。

var constraint: NSLayoutConstraint! = nil 

然後你需要遍歷它們並找到所需的一個像這樣。

for const in myButton.constraints { 
    if const.firstAttribute == NSLayoutAttribute.Width { 
     constraint = const 
     break 
    } 
} 

寬度約束的第一個屬性始終設置爲「寬」,你也可以把額外的檢查,就像下面有關它與if語句

const.firstItem as! NSObject == myButton 

因爲第一項應用約束的項目的寬度約束本身。 如果有效,請嘗試。如果你發現它,我建議刪除特定的約束並添加一個新的約束。在下面的項目上添加寬度約束是代碼。假設你想要的寬度是50像素。

myButton.addConstraint(NSLayoutConstraint(item: myButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 50.0)) 

這是正確的做法。不要激活或停用它。