使用故事板中设置的标识符获取对NSLayoutConstraint的引用

我使用故事板来设置button的约束。 我在约束的属性中看到一个选项“标识符”。

约束属性的屏幕截图

我想引用这个约束,在代码中改变它的值,移动一个对象。

我怎样才能从这个标识符引用这个NSLayoutContraint

我阅读文档,它是这样写的

 @interface NSLayoutConstraint (NSIdentifier) /* For ease in debugging, name a constraint by setting its identifier, which will be printed in the constraint's description. Identifiers starting with UI and NS are reserved by the system. */ @property (nullable, copy) NSString *identifier NS_AVAILABLE_IOS(7_0); @end 

所以我意识到这是为了debugging的目的。

如果我想得到它并使用它呢? 我看到这个链接,但没有给出令人满意的答案: 如何通过它的指针获取NSLayoutConstraint的标识符?

Swift 3中

  let filteredConstraints = button.constraints.filter { $0.identifier == "identifier" } if let yourConstraint = filteredConstraints.first { // DO YOUR LOGIC HERE } 

我假设你有一个button设置的button,所以你有一个可用的参考。 所以首先,从您的button检索视图的约束。 然后遍历数组,并在每次迭代中比较每个约束的标识符属性与您在Interface Builder中input的值。 看起来你在Objective-C编码,所以Objective-C代码示例如下。 将@“标识符”更改为您在Interface Builder中设置的值。

 NSArray *constraints = [button constraints]; int count = [constraints count]; int index = 0; BOOL found = NO; while (!found && index < count) { NSLayoutConstraint *constraint = constraints[index]; if ( [constraint.identifier isEqualToString:@"identifier"] ) { //save the reference to constraint found = YES; } index++; } 

Swift 3

我写了一个快速处理这个很好的NSView扩展。

 extension NSView { func constraint(withIdentifier: String) -> NSLayoutConstraint? { return self.constraints.filter { $0.identifier == withIdentifier }.first } } 

用法:

 if let c = button.constraint(withIdentifier: "my-button-width") { // do stuff with c } 

调整公共视图容器中的一组button的大小,这是有效的。 每个子视图/button必须使用一个公共的标识符(例如“高度”)。

 @IBAction func btnPressed(_ sender: UIButton) { for button in self.btnView.subviews{ for constraint in button.constraints{ if constraint.identifier == "height"{ constraint.constant = constraint.constant == 0 ? 30:0 } } } UIView.animate(withDuration: 0.3) { () -> Void in self.view.layoutIfNeeded() } }