需要有关以编程方式创建自动布局约束的帮助
Posted
技术标签:
【中文标题】需要有关以编程方式创建自动布局约束的帮助【英文标题】:Need assistance regarding creating auto layout constraints programmatically 【发布时间】:2015-12-16 07:13:35 【问题描述】:这是我第一次尝试以编程方式创建auto layouts constraints
,这是我的代码
- (void)viewDidLoad
[super viewDidLoad];
UIView *view1 = [[UIView alloc]init];
view1.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:view1];
[view1 setTranslatesAutoresizingMaskIntoConstraints:NO];
NSDictionary *views = NSDictionaryOfVariableBindings(view1);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[view1]-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view1]-|" options:0 metrics:nil views:views];
[view1 addConstraints:constraints];
[view1 addConstraints:verticalConstraints];
这就是我试图在代码中做的事情。
我遇到了这个巨大的错误
2015-12-16 12:13:59.254 test5b[1138:430691] 视图层次结构不是 为约束做好准备:当 添加到视图中,约束的项目必须是该视图的后代 视图(或视图本身)。如果约束需要,这将崩溃 在组装视图层次结构之前解决。打断 -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] 进行调试。 2015-12-16 12:13:59.259 test5b [1138:430691] 未准备好查看层次结构 约束。约束: 容器层次结构:> 在容器层次结构中找不到视图:> 该视图的超级视图:;层 = > 2015-12-16 12:13:59.260 test5b[1138:430691] * 由于未捕获的异常“NSGenericException”而终止应用程序, 原因:'无法在视图上安装约束。是否有约束 从视图的子树之外引用一些东西?那是 非法的。约束: 查看:>' * 第一次抛出调用栈:(0x1829f4f5c 0x1975e7f80 0x1829f4ea4 0x183890ef4 0x18804c620 0x18804c428 0x18804c2d0 0x18804c194 0x188056504 0x183890aa0 0x18805330c 0x188056420 0x1000d65f0 0x187f63a0c 0x187fd2fcc 0x187fd2f68 0x1881f494c 0x188200de4 0x1829ac48c 0x1829abdc4 0x1829a9d28 0x1828d8dc0 0x18da2c088 0x187fb2f60 0x1000d6ab8 0x197e128b8) libc++abi.dylib:终止于 NSException (lldb) 类型的未捕获异常
【问题讨论】:
【参考方案1】:为self.view
添加约束。替换以下内容:
[view1 addConstraints:constraints];
[view1 addConstraints:verticalConstraints];
与
[self.view addConstraints:constraints];
[self.view addConstraints:verticalConstraints];
【讨论】:
感谢它的工作,但为什么 self.view,我希望这些在 view1 上,就像我们在故事板中 ctrl+从 view1 拖动到超级视图一样... ***.com/questions/18177262/… 提供一个很好的理由来说明我们为什么要对 self 进行约束。 View1 不在视图层次结构中。 为什么 view1 不在层次结构中我做了 [self.view addsubview:view1] 并且如果我在情节提要中应用相同并选择 view1,那么在尺寸检查器中所有约束都会出现在 view1 中。 您正在设置约束,以便视图知道如何布局它的子视图。视图在其子视图层次结构中没有自己... 从 ios 8 开始,您不应再使用addConstraints:
。使用+[NSLayoutConstraint activateConstraints:]
或-[NSLayoutConstraint setActive:]
。以上是关于需要有关以编程方式创建自动布局约束的帮助的主要内容,如果未能解决你的问题,请参考以下文章
如何在ios swift中以编程方式创建自动布局等宽度约束?