Iphone 在子类UIView的子视图上以编程方式自动布局
我已将UIView子类化,以创建一个自定义的groupView,用于以简单的方式向布局中添加一些内容。此groupView包括一个用作标题的UILabel和一个在其CALayer上用背景色绘制roundRect的UIView。想想UITableView的部分。我通过删除UIView并将其类更改为我的子类,将此groupView添加到情节提要中。一切都很好,我通过Xcode中用户定义的运行时属性设置了标题。这一切都很好,我将UILabels添加到故事板上的这个视图中,并在运行时创建标题标签和roundrect my groupView的结构:Iphone 在子类UIView的子视图上以编程方式自动布局,iphone,ios6,nslayoutconstraint,Iphone,Ios6,Nslayoutconstraint,我已将UIView子类化,以创建一个自定义的groupView,用于以简单的方式向布局中添加一些内容。此groupView包括一个用作标题的UILabel和一个在其CALayer上用背景色绘制roundRect的UIView。想想UITableView的部分。我通过删除UIView并将其类更改为我的子类,将此groupView添加到情节提要中。一切都很好,我通过Xcode中用户定义的运行时属性设置了标题。这一切都很好,我将UILabels添加到故事板上的这个视图中,并在运行时创建标题标签和rou
- 标题:(UILabel)已定位 在组视图上方
- contentView:(UIView)创建roundRect 和颜色通过CALayer,应与groupView的大小相同
_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];