我已经创建了子类UIView来创建一个自定义的组视图,以便以简单的方式向布局中添加一些内容。这个groupView包含一个用作标题的UILabel和一个用背景颜色在CALayer上绘制一个roundRect的UIView。想想UITableView的部分。我通过删除一个UIView并将它的类更改为我的子类来将此groupView添加到故事板。一切正常,我通过Xcode中的用户定义的运行时属性设置标题。所有的作品都很棒,我在故事板上的这个视图中添加了UILabels,并在它运行时创建了标题标签和圆角。以编程方式自动生成子类UIView的子视图
结构我groupView的:
- groupView:(UIView的)clipToBounds:否;
- 标题:(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:不知怎的,这个自动版式是想拯救我们的工作,但我 怎么看不到好处了重量开销现在。为什么 他们从使用参考和方法,甚至输入 defs这个古老的格式字符串?这样做会容易多少: [_contentView constraint:NSLayoutFormatAlignLeading toView:self withDistance:0.0f];或类似的东西?在这一点上,我宁愿用弹簧和支柱来处理 。
任何帮助理解,或向我展示将contentView约束为自身大小的语法将有所帮助。
关于你的咆哮:Autolayout有一个学习曲线,你一开始往往会讨厌它 - 但一旦你完全用约束而不是框架来思考,它会变得更容易。而“视觉格式”是非常没用的,除非你只是把东西排成一排。另一种方法(constraintWithItem ...)基本上就是你在上面提到的语法之后的语法。 – jrturton
如果其他人在理解这种ASCII-Art格式字符串时遇到问题,我发现本教程很有帮助。我知道它是用于Ruby的,但格式字符串与Objective-C中的相同。 http://seanlilmateus.github.com – brucemartin