我将UIView子类化为一个自定义groupView,我使用它以一种简单的方式向布局中添加了一些内容。这个groupView包括一个用作标题的UILabel和一个使用背景色在其CALayer上绘制一个roundRect的UIView。想想UITableView的部分。我通过删除UIView并将其类更改为子类来将此groupView添加到 Storyboard 。一切正常,我通过Xcode中用户定义的运行时属性来设置标题。一切都很好,我将UILabels添加到 Storyboard 上的此 View 中,并创建了标题标签,并在运行时进行了圆角对齐。

我的groupView的结构:

  • groupView:(UIView)clipToBounds:NO;
  • 标题:(UILabel)已定位
    在groupView上方。
  • contentView:(UIView)创建roundRect
    和通过CALayer进行的颜色设置应与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'而终止应用程序,原因:'无法在 View 上安装约束。约束是否引用了 View 子树之外的内容?那是非法的。约束: View :>'

    我先尝试了一下,但仍然没有用:
        NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_contentView);
        NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[_contentView]-0-|" options:0 metrics:nil views:viewsDictionary];
    

    崩溃的原因:*由于未捕获的异常'NSGenericException'而终止应用程序,原因:'无法在 View 上安装约束。约束是否引用了 View 子树之外的内容?那是非法的。约束: View :>'



    任何有帮助的理解,或向我显示将contentView限制为self大小的语法都将是有帮助的。

    最佳答案

    该错误告诉您需要了解的内容:



    是的,它确实。它引用其 super View 。

    您需要将这些约束应用于 super View ,在本例中为groupView

    10-08 07:48