意外的 NSAutoresizingMaskLayoutConstraint 将 UIView 从笔尖添加到自动布局情节提要场景

Posted

技术标签:

【中文标题】意外的 NSAutoresizingMaskLayoutConstraint 将 UIView 从笔尖添加到自动布局情节提要场景【英文标题】:Unexpected NSAutoresizingMaskLayoutConstraint adding UIView from nib to autolayout storyboard scene 【发布时间】:2014-08-03 05:35:18 【问题描述】:

我在 IB 中有以下内容,两个视图都启用了“使用自动布局”和“调整子视图大小”。

我只是想将 Autolayout View 的一个实例添加到容器视图中,使其边缘与容器视图的边缘相接。容器视图启用了 Uses Auto Layout 并且高度相同但宽度是原来的两倍。代码如下:

- (IBAction)addSubviewButton:(id)sender

  UIView *autolayoutView = [[[NSBundle mainBundle] loadNibNamed:@"AutolayoutView" owner:nil options:nil] objectAtIndex:0];
  [self.containerView addSubview:autolayoutView];

  [self.containerView addConstraint:
   [NSLayoutConstraint constraintWithItem:autolayoutView
                            attribute:NSLayoutAttributeLeading
                            relatedBy:NSLayoutRelationEqual
                               toItem:self.containerView
                            attribute:NSLayoutAttributeLeading
                           multiplier:1
                             constant:0]];
  [self.containerView addConstraint:
   [NSLayoutConstraint constraintWithItem:autolayoutView
                            attribute:NSLayoutAttributeTrailing
                            relatedBy:NSLayoutRelationEqual
                               toItem:self.containerView
                            attribute:NSLayoutAttributeTrailing
                           multiplier:1
                             constant:0]];
  [self.containerView addConstraint:
  [NSLayoutConstraint constraintWithItem:autolayoutView
                           attribute:NSLayoutAttributeTop
                           relatedBy:NSLayoutRelationEqual
                              toItem:self.containerView
                           attribute:NSLayoutAttributeTop
                          multiplier:1.0
                            constant:0.0]];
  [self.containerView addConstraint:
  [NSLayoutConstraint constraintWithItem:autolayoutView
                           attribute:NSLayoutAttributeBottom
                           relatedBy:NSLayoutRelationEqual
                              toItem:self.containerView
                           attribute:NSLayoutAttributeBottom
                          multiplier:1.0 constant:0.0]];

发生错误:

Probably at least one of the constraints in the following list is one you don't want...
(
"<NSIBPrototypingLayoutConstraint:0x8c364d0 'IB auto generated at build time for view with fixed frame' H:[UIView:0x8c356f0(275)]>",
"<NSLayoutConstraint:0x8d43d80 H:|-(0)-[AutolayoutView:0x8d47a30]   (Names: '|':UIView:0x8c356f0 )>",
"<NSLayoutConstraint:0x8d09260 AutolayoutView:0x8d47a30.trailing == UIView:0x8c356f0.trailing>",
"<NSAutoresizingMaskLayoutConstraint:0x8d0eca0 h=--& v=--& AutolayoutView:0x8d47a30.midX == + 70>"
)

看起来 NSAutoresizingMaskLayoutConstraint 是在 Autolayout View 添加为子视图后自动创建的?在 didMoveToSuperview 中打印 Autolayout View 的约束时,它还不存在。如何解决?我想尝试在 IB 中的自动布局视图上创建约束作为在构建时忽略的占位符,但是 IB 为自动布局视图禁用了所有自动布局选项。

【问题讨论】:

查看IB中***视图的属性。应该有一个“将自动调整掩码转换为约束”复选框。你需要把它关掉。或者,您可以在加载视图后在代码中设置translatesAutoresizingMaskIntoConstraints 属性。 @KenThomases 感谢您的提示。在代码中关闭 translatesAutoresizeMaskIntoConstraints 有效。 'Use Autolayout' 是我在 IB 中能找到的最接近的,但 Autoresize 约束仍在创建中。 【参考方案1】:

删除这个约束的最简单方法是在 Swift 中将视图的 translatesAutoresizingMaskIntoConstraints 设置为 false(或在 Objective-C 中设置为 NO)。你可以在没有任何代码的情况下做到这一点。您可以在界面生成器中使用关键路径(附屏幕)。

【讨论】:

以上是关于意外的 NSAutoresizingMaskLayoutConstraint 将 UIView 从笔尖添加到自动布局情节提要场景的主要内容,如果未能解决你的问题,请参考以下文章

解析错误:意外的令牌,预期的“,”和语法错误:意外的令牌'['[重复]

如和找到或再次打开意外关闭的网页?

JAVA中提示“意外的类型”啥意思,怎么解决?

HQL 意外的 AST 节点:意外的 AST 节点:

巧合?严重RCE漏洞竟被意外修复

错误消息显示意外的尖括号,但应该没有意外的尖括号