我将 UIView 子类化为自定义 groupView,我用它以简单的方式向我的布局添加一些东西。这个 groupView 包括一个用作标题的 UILabel 和一个在它的 CALayer 上绘制一个带有背景颜色的 roundRect 的 UIView。想想 UITableView 的部分。我通过删除 UIView 并将其类更改为我的子类来将此 groupView 添加到情节提要。一切正常,我通过 Xcode 中用户定义的运行时属性设置标题。一切都很好,我在故事板上的这个视图中添加了 UILabels,它在运行时创建了标题标签和圆形矩形。
我的 groupView 的结构:
- groupView: (UIView)clipToBounds:NO;
- 标题:(UILabel)位于 groupView 上方。
- contentView:(UIView) 通过CALayer 创建roundRect 和颜色,应该和groupView 一样大小。
所以有什么问题?好吧,开始处理自动布局是一件很痛苦的事情,但是为了让这个子类 UIView 工作,我需要以编程方式设置 contentView 约束。我无法弄清楚这个自动布局 ASCII 格式字符串的语法。目前我有:
_contentView = [[UIView alloc]initWithFrame:self.bounds];
_contentView.layer.cornerRadius = 5.0f;
_contentView.layer.masksToBounds=YES;
_contentView.backgroundColor=_backgroundColor;
_contentView.layer.borderWidth=_borderWidth;
_contentView.layer.borderColor=_borderColor.CGColor;
[self insertSubview:_contentView atIndex:0];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(self,_contentView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[self]-0-[_contentView]-0-[self]" options:0 metrics:nil views:viewsDictionary];
for (NSLayoutConstraint *constraint in constraints) {
[_contentView addConstraint:constraint];
}
哪个崩溃:*由于未捕获的异常“NSGenericException”而终止应用程序,原因:“无法在视图上安装约束。约束是否引用了视图子树之外的内容?那是违法的。约束:视图:>'
我先尝试了这个,它仍然没有工作:
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_contentView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[_contentView]-0-|" options:0 metrics:nil views:viewsDictionary];
哪个崩溃:*由于未捕获的异常“NSGenericException”而终止应用程序,原因:“无法在视图上安装约束。约束是否引用了视图子树之外的内容?那是违法的。约束:视图:>'
RANT:不知何故,这个 AutoLayout 应该可以节省我们的工作量,但我不明白现在的好处是如何超过开销的。他们到底为什么要从使用引用和方法甚至类型定义转移到这种古老的格式字符串?做起来容易多少:[_contentView 约束:NSLayoutFormatAlignLeading toView:self withDistance:0.0f]; 或者类似的东西?在这一点上,我更愿意处理弹簧和支柱。
任何帮助理解或向我展示将 contentView 限制为 self 大小的语法都会有所帮助。