有没有办法在Interface Builder中为Auto Layout Constraints添加标识符?

在Interface Builder中进行了一些可视化布局后,我创建了一些我想在运行时访问的约束。 有没有办法在Interface Builder中标记或识别约束,以便以后查找它们?

我想这样做的原因是我需要根据视觉指定的约束执行一些计算。 我知道Apple提供了可视格式语言 ,我可以在控制器中以编程方式指定约束。 我宁愿不使用这种方法,所以我不会失去IB的设计时间反馈。

编辑

建立一个引用sockets确实有效,但问题仍然存在。

更新:

正如BartłomiejSemańczyk在他的回答中所解释的那样,现在在属性检查器中可以看到NSLayoutConstraint标识符字段,因此不必自己公开该字段。 只需在“ 文档大纲”视图或“故事板”视图中选择约束,然后在右侧的“ 属性”检查器中添加标识符。


早期答案:

是的,这可以做到。 NSLayoutConstraint有一个名为identifier的属性,可以在Interface Builder中公开并分配。 为了演示这个,我创建了一个单视图应用程序 ,它有一个红色框的子视图。 此子视图有4个约束:宽度,高度,在容器中水平居中,在容器中垂直居中。 我通过执行以下操作给宽度约束标识符redBoxWidth

  1. 单击“ 文档布局视图”中的宽度约束。 然后在User Defined Runtime Attributes下的Identity Inspector中 ,单击Key Path下的+ 。 将keyPath更改为identifier ,将Type Boolean更改为String ,并将Value设置为redBoxWidth

    命名约束

  2. 然后在ViewDidLoad ,可以按名称查找约束并更改其值:

     class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() for subview in view.subviews as [UIView] { for constraint in subview.constraints() as [NSLayoutConstraint] { if constraint.identifier == "redBoxWidth" { constraint.constant = 300 } } } } } 
  1. 从Xcode 7开始,您可以在故事板中完成:

在此处输入图像描述

  1. 但是,如果在代码中设置约束,请执行以下操作:

     let constraint = NSLayoutConstraint() constraint.identifier = "identifier" 
  2. 对于这些约束,您已在storyboard中设置,但必须在代码中设置标识符:

     for subview in view.subviews { for constraint in subview.constraints() { constraint.identifier = "identifier" } } 

您也可以像对任何其他组件一样将约束链接到控制器的属性。 只需按住Ctrl键将其拖入您的代码:

在此处输入图像描述

然后它将在您的控制器的代码中作为属性访问:

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *myConstraint; 

你可以改变它的价值,例如:

 self.myConstraint.constant=100.; 

只需添加@ vacawama的答案。 您可以编写UIView类别并使用简单函数提取约束,而不是在需要查找约束的任何位置复制/粘贴循环:

.h文件:

 #import  @interface UIView (EasyAutolayout) -(NSLayoutConstraint *)constraintForIdentifier:(NSString *)identifier; @end 

.m文件:

 #import "UIView+EasyAutolayout.h" @implementation UIView (EasyAutolayout) -(NSLayoutConstraint *)constraintForIdentifier:(NSString *)identifier { for (NSLayoutConstraint *constraint in self.constraints) { if ([constraint.identifier isEqualToString:identifier]) { return constraint; } } return nil; } @end 

获取自动布局约束的IBOutlet。

NSLayoutConstraint类中有一个名为constant的属性。

例如,您已经从IB的任何视图中获取了IBOutlet的高度约束,并且您希望以编程方式更改它的高度,您需要做的就是:

  constraint.constant = isMoreHeight ? height1 : height2; 

执行此操作后,您需要更新superview的视图层次结构中的所有其他视图。 为此,您需要在下面写一行:

 [self setLayoutIfNeeded]; 

为了获得更好的用户体验,您可以将此行放在动画块中,以获得更平滑的过渡效果,

 [UIView animateWithDuration:0.3f animations:^{ [self.view layoutIfNeeded]; }]; 

希望这可以帮助..

那这个呢:

 if let myconstraint = self.view.constraints.filter( { $0.identifier == "myconstraintId" }).first { // TODO: your code here... } 
Interesting Posts