2016-11-17 77 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]) 
}