2012-11-20 65 views
12

我已经创建了子类UIView来创建一个自定义的组视图,以便以简单的方式向布局中添加一些内容。这个groupView包含一个用作标题的UILabel和一个用背景颜色在CALayer上绘制一个roundRect的UIView。想想UITableView的部分。我通过删除一个UIView并将它的类更改为我的子类来将此groupView添加到故事板。一切正常,我通过Xcode中的用户定义的运行时属性设置标题。所有的作品都很棒,我在故事板上的这个视图中添加了UILabels,并在它运行时创建了标题标签和圆角。以编程方式自动生成子类UIView的子视图

结构我groupView的:

  1. groupView:(UIView的)clipToBounds:否;
    • 标题:(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:不知怎的,这个自动版式是想拯救我们的工作,但我 怎么看不到好处了重量开销现在。为什么 他们从使用参考和方法,甚至输入 defs这个古老的格式字符串?这样做会容易多少: [_contentView constraint:NSLayoutFormatAlignLeading toView:self withDistance:0.0f];或类似的东西?在这一点上,我宁愿用弹簧和支柱来处理 。

任何帮助理解,或向我展示将contentView约束为自身大小的语法将有所帮助。

+2

关于你的咆哮:Autolayout有一个学习曲线,你一开始往往会讨厌它 - 但一旦你完全用约束而不是框架来思考,它会变得更容易。而“视觉格式”是非常没用的,除非你只是把东西排成一排。另一种方法(constraintWithItem ...)基本上就是你在上面提到的语法之后的语法。 – jrturton

+0

如果其他人在理解这种ASCII-Art格式字符串时遇到问题,我发现本教程很有帮助。我知道它是用于Ruby的,但格式字符串与Objective-C中的相同。 http://seanlilmateus.github.com – brucemartin

回答

26

错误告诉你,你需要知道:

是否约束参考的东西从视图中的子树之外?

是的。它引用了它的超级视图。

你正在需要这些限制将被应用于上海华,在这种情况下groupView

+0

好吧,但是这不是子视图的约束吗?这是我需要自动调整大小的子视图。我只是在想这个错吗? – brucemartin

+1

想一下这样:它对'groupView'中'contentView'的位置和大小有一个约束。请参阅安装限制部分:http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/constraintFundamentals.html – jackslash

+0

好吧,是的,我看到现在,这就是为什么在Xcode的约束下显示superViews不是视图本身。仍然有语法问题。回到文档中,也许它会在这个时候下沉。感谢您的洞察力。 – brucemartin

0

的|字符表示的视觉形式语言的上海华盈,所以我想你想:

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

,然后你需要将约束添加到自我,而不是内容查看,你需要将它添加到可以看到一个视图所有参与的球员。

下面是视觉语言参考: 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 
+0

当然,如果你将约束添加到self而不是contentView,那么管道(|)将引用self的superview? –

0

尝试检查constrints,他们是否正确添加到视图

如:

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 toyellowView就像下面一样。它会显示错误

[yellowView addConstraints:@ [heightAnchor]];

相关问题