Iphone 在子类UIView的子视图上以编程方式自动布局

Iphone 在子类UIView的子视图上以编程方式自动布局,iphone,ios6,nslayoutconstraint,Iphone,Ios6,Nslayoutconstraint,我已将UIView子类化,以创建一个自定义的groupView,用于以简单的方式向布局中添加一些内容。此groupView包括一个用作标题的UILabel和一个在其CALayer上用背景色绘制roundRect的UIView。想想UITableView的部分。我通过删除UIView并将其类更改为我的子类,将此groupView添加到情节提要中。一切都很好,我通过Xcode中用户定义的运行时属性设置了标题。这一切都很好,我将UILabels添加到故事板上的这个视图中,并在运行时创建标题标签和rou

我已将UIView子类化,以创建一个自定义的groupView,用于以简单的方式向布局中添加一些内容。此groupView包括一个用作标题的UILabel和一个在其CALayer上用背景色绘制roundRect的UIView。想想UITableView的部分。我通过删除UIView并将其类更改为我的子类,将此groupView添加到情节提要中。一切都很好,我通过Xcode中用户定义的运行时属性设置了标题。这一切都很好,我将UILabels添加到故事板上的这个视图中,并在运行时创建标题标签和roundrect

my groupView的结构:

  • groupView:(UIView)clipToBounds:否;
    • 标题:(UILabel)已定位 在组视图上方
    • contentView:(UIView)创建roundRect 和颜色通过CALayer,应与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];
        }
    
    由于以下原因崩溃:*由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“无法在视图上安装约束”。约束是否引用了视图子树之外的内容?那是违法的。约束:视图:>'

    我先尝试了一下,但仍然不起作用:

        NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_contentView);
        NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[_contentView]-0-|" options:0 metrics:nil views:viewsDictionary];
    
    由于以下原因崩溃:*由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“无法在视图上安装约束”。约束是否引用了视图子树之外的内容?那是违法的。约束:视图:>'

    兰特:不知怎么的,这个自动布局应该可以节省我们的工作,但是 我现在看不出这些好处如何超过管理费用。为什么? 他们到底是从使用引用和方法,还是从使用类型 定义为这个古老的格式字符串?这样做会容易得多: [\u contentView约束:NSLayoutFormatAlignLeading to视图:self 距离:0.0f];还是类似的?我宁愿做交易 在这一点上使用弹簧和支柱


    任何有助于理解或向我展示将contentView限制为self大小的语法的帮助都会很有帮助。

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

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

    是的。它引用它的superview


    您所做的这些约束需要应用于superview,在本例中,
    组视图

    字符表示视觉格式语言中的superview,因此我认为您需要:

    @"|-0-[_contentView]-0-|"
    
    然后,您需要将约束添加到self而不是contentView,因为您需要将它添加到一个可以看到所有参与者的视图中

    以下是视觉语言的参考:

    您还可以使用以下方法完全避免视觉格式:

    +(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c
    

    尝试检查结构是否正确并添加到视图中

    例如:

    如果将
    heightAnchor添加到
    yellowView
    中,如下所示。它将显示错误

    [yellowView添加约束:@[heightAnchor]]


    好的,但这不是子视图的约束吗?这是我需要自动调整大小的子视图。我只是想错了吗?这样想:这是对
    groupView
    contentView
    的位置和大小的限制。请参阅安装约束部分:好的,是的,我现在看到了,这就是为什么Xcode中的约束显示在SuperView下,而不是视图本身。仍然有语法问题。回到医生那里,也许这次会沉下去。谢谢你的洞察力。关于你的咆哮:Autolayout有一个学习曲线,一开始你确实会讨厌它——但是一旦你完全在约束而不是框架中思考,它就会变得更容易。“视觉格式”是非常无用的,除非你只是把东西排成一行。另一种方法(constraintWithItem…)基本上就是您在上面的rant中所使用的语法。如果其他人在理解ASCII艺术格式字符串时遇到问题,我发现本教程很有帮助。我知道它适用于Ruby,但格式字符串与Objective-C中的相同。如果您将约束添加到self而不是contentView,那么管道(|)将引用self的superview?
    UIView *yellowView = [[UIView alloc] init];
    yellowView.backgroundColor = [UIColor yellowColor];
    yellowView.translatesAutoresizingMaskIntoConstraints = false;
    [self.view addSubview:yellowView];
    
    //ios 9 last
    NSLayoutConstraint *heightAnchor = [yellowView.heightAnchor constraintEqualToAnchor:self.purView.heightAnchor];
    // addConstraints
    [self.view  addConstraints:@[heightAnchor]];
    [self.view setNeedsLayout];