以编程方式在子类UIView的子视图上进行Autolayout

bru*_*tin 12 iphone ios6 nslayoutconstraint

我已经将UIView子类化为一个自定义的groupView,我用它来以简单的方式为我的布局添加一些东西.这个groupView包含一个用作标题的UILabel和一个用它在背景颜色的CALayer上绘制roundRect的UIView.想想UITableView的部分.我通过删除UIView并将其类更改为我的子类,将此groupView添加到storyboard中.一切正常,我通过Xcode中的用户定义的运行时属性设置标题.一切都很棒,我在故事板上将UILabels添加到此视图中,并在运行时创建标题标签并进行圆整.

我的groupView结构:

  1. groupView:(UIView)clipToBounds:NO;
    • 标题:(UILabel)位于groupView上方.
    • contentView:(UIView)通过CALayer创建roundRect和color,应该与groupView的大小相同.

所以有什么问题?好吧,处理autolayout是一个痛苦的开始,但为了使这个子类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];
    }
Run Code Online (Sandbox Code Playgroud)

哪个崩溃:*由于未捕获的异常'NSGenericException'终止应用程序,原因:'无法在视图上安装约束.约束是否引用了视图子树之外的内容?那是违法的.约束:查看:>'

我先尝试过这个但它仍然没有用:

    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_contentView);
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[_contentView]-0-|" options:0 metrics:nil views:viewsDictionary];
Run Code Online (Sandbox Code Playgroud)

哪个崩溃:*由于未捕获的异常'NSGenericException'终止应用程序,原因:'无法在视图上安装约束.约束是否引用了视图子树之外的内容?那是违法的.约束:查看:>'

RANT:不知怎的,这个AutoLayout假设是为了节省我们的工作,但我不知道这些好处如何影响现在的开销.为什么他们从使用引用和方法,甚至键入defs到这个古老的格式字符串?它会更容易:[_ contentView约束:NSLayoutFormatAlignLeading toView:self withDistance:0.0f]; 或类似的东西?在这一点上,我更愿意处理弹簧和支柱.

任何帮助理解,或向我展示将contentView约束到自我大小的语法将是有帮助的.

jac*_*ash 28

错误告诉您需要知道的内容:

约束是否引用了视图子树之外的内容?

是的,它确实.它引用了它的超级视图.

您正在制作的这些约束需要应用于superview,在本例中为groupView.