12

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

我的 groupView 的结构:

  1. 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 大小的语法都会有所帮助。

4

3 回答 3

29

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

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

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

您所做的这些约束需要应用于超级视图,在本例中为groupView.

于 2012-11-20T17:13:24.970 回答
0

该| 字符代表视觉格式语言中的超级视图,所以我认为你想要:

@"|-0-[_contentView]-0-|"

然后您需要将约束添加到 self 而不是 contentView,因为您需要将其添加到可以看到所有参与者的视图中。

这是视觉语言的参考: https ://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html#//apple_ref/doc/uid/TP40010853-CH3- SW1

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

+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c
于 2013-04-04T21:36:38.660 回答
0

尝试检查约束,它们是否正确添加到视图中

例如:

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];

如果添加heightAnchor to yellowView喜欢跟随。它会显示错误

[yellowView addConstraints:@[heightAnchor]];

于 2016-08-30T06:41:51.610 回答