2016-11-17 61 views
0

我有兩個不同約束的按鈕寫入故事板。 在我的代碼,我要告訴我的第一個按鈕拍攝第二個按鈕(高度,寬度,和位置)相同的約束,但我不知道如何做到這一點,而不必通過「子視圖」過客。我有兩個插座供我的按鈕使用。如何通過編程方式修改UIButton的約束條件

@IBOutlet weak var likesButton: UIButton!  
@IBOutlet weak var shareButton: UIButton! 

我的界面是建立這樣的:

-

VIEW 
    a)...View 
    b)...View 
    c) ContentView 
     1)likeButton 
     2)shareButton 
     3)... 
    d)... 

我想是這樣的:

 self.contentView.translatesAutoresizingMaskIntoConstraints = false 
     self.shareButton.removeConstraints(self.shareButton.constraints) // Old Constraints 
     self.shareButton.addConstraints(self.likeButton.constraints) // New Constraints 
     self.shareButton.updateConstraintsIfNeeded() 
     self.shareButton.layoutIfNeeded() 

後,我有這樣的錯誤:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view. Does the constraint reference something from outside the subtree of the view? That's illegal. constraint:<NSLayoutConstraint:0x14cfe7600 H:[UIButton:0x14cfb7bd0(40)]> view:<UIButton: 0x14e30fa60; frame = (494 528; 26 31); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x14e30f410>>' 

Thx提前。

+0

約束被添加到超級視圖,該超級視圖持有您試圖添加約束的視圖,而不是視圖本身。 – Rikh

+0

好吧,但是我說要添加約束到shareButton而不是視圖? – CizooDev

回答

1

是否從該視圖的子樹外的約束參考的東西嗎?

這是因爲如果它說...

是否的likeButton參考一些約束從shareButton的子樹之外?

因此,likeButton約束引用(如likeButton本身)完全在shareButtons視圖層次結構之外。他們不能這樣添加。

你可以做,而不是:

self.view.removeConstraints(self.shareButton.constraints) 
self.view.addConstraints(self.likeButton.constraints) 

但這不會完成任何你正在試圖做的。

約束不僅僅是一個數量和尺寸等等。它還定義哪兩個對象受到約束。所以試圖將一個視圖約束映射到另一個視圖,因爲它不會改變約束中引用的視圖。

你或許可以砍出了一種使用網點的各種限制和拉動約束常量出一個觀點,並將它們分配給另做它。

+0

Thx爲我提供了使用網點限制來實現它的方法!這有很大的幫助! – CizooDev

1

如果這是您的方案:

  • 你的按鈕約束已經成立了IB,你在代碼中希望更改或替換約束逐一

然後你就可以建立一個IBOutlet每個約束,做你的編輯(改變,更換或停用甚至他們)的名字。

@IBOutlet weak var likesConstraintLeading: NSLayoutConstraint! 
@IBOutlet weak var likesConstraintTop: NSLayoutConstraint! 
@IBOutlet weak var likesConstraintWidth: NSLayoutConstraint! 

likesConstraintLeading.isActive = false 
likesConstraintTop.constant = 20 
likesConstraintWidth.multiplier = 3.5 
  • 你的按鈕約束已經成立了IB,並且希望取代整個限制設置爲一個IBOutlet中名爲按鈕

你可以將代碼中的一組新約束設置爲數組,並在移除舊約束後激活它們。

@IBOutlet weak var likesConstraintTop: NSLayoutConstraint! 
@IBOutlet weak var likesConstraintLeading: NSLayoutConstraint! 
@IBOutlet weak var likesConstraintWidth: NSLayoutConstraint! 

var newConstraints = [NSLayoutConstraint]() 

newConstraints.append(likesButton.leadingAnchor.constraint(equalTo: view.leadingAnchor)) 
newConstraints.append(likesButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 20)) 
newConstraints.append(likesButton.widthAnchor.constraint(equalToConstant: 100)) 

likesConstraintLeading.isActive = false 
likesConstraintTop.isActive = false 
likesConstraintWidth.isActive = false 
NSLayoutConstraint.activate([newConstraints]) 

請注意 - 你仍然需要,因爲這些限制(除了寬度)添加到控制的上海華停用事情一個接一個,有可能有更多的約束在裏面!

  • 您在IB中設置了按鈕,但您希望通過代碼維護一組約束。

恕我直言,這是你能做的最好的設置,因爲你可以仍然添加您的所有其他約束通過IB和你的代碼限制到你想改變什麼。

var startingConstraints = [NSLayoutConstraint]() 
var endingConstraints = [NSLayoutConstraint]() 

override func viewDidLoad() { 
    startingConstraints.append(likesButton.leadingAnchor.constraint(equalTo: view.leadingAnchor)) 
    startingConstraints.append(likesButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 20)) 
    startingConstraints.append(likesButton.widthAnchor.constraint(equalToConstant: 100)) 
    endingConstraints.append(likesButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30)) 
    endingConstraints.append(likesButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 40)) 
    endingConstraints.append(likesButton.widthAnchor.constraint(equalToConstant: 80)) 
    NSLayoutConstraint.activate([startingConstraints]) 
} 

func changeConstraints() { 
    NSLayoutConstraint.deactivate([newConstraints]) 
    NSLayoutConstraint.activate([newConstraints]) 
} 
相關問題