2016-09-30 9 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 

に適用されている項目については、以下のような追加のチェックを入れることができます幅の制約のそれ自体です。 try if works。 試してください。それを見つけたら、特定の制約を削除し、新しい制約を追加することをお勧めします。下の項目に幅の制約を追加するには、コードを使用します。あなたが望む幅が50ピクセルだとします。

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

これは正しいアプローチです。それを有効または無効にしないでください。

関連する問題