2014-01-20 54 views
-5

当我做了UIView的子视图的初始设置,如果我初始化一个UIViewAutoLayout代码应放在哪里?

//Listing A 
UIView *redBox = [[UIView alloc] init]; 
[redBox setBackgroundColor:[UIColor redColor]]; 
[self.view addSubview:redBox]; 
[redBox setTranslatesAutoresizingMaskIntoConstraints:NO]; 

而且我想以编程方式应用自动布局约束它:

//Listing B 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[redBox(100)]" options:0 metrics:nil views:@{@"redBox": redBox}]; 
[self.view addConstraints:constraints]; 
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[redBox(100)]" options:0 metrics:nil views:@{@"redBox": redBox}]; 
[self.view addConstraints:constraints]; 

在哪里应列出B去?

它应该总是紧随清单A?

或者,如果我们在一个UIView子类,它应该进入:

  • updateConstraints
  • initWithFrame
  • layoutSubviews

同样,如果我们在一个UIViewController子类,我把列表A中viewDidLoad,应列表B紧跟它还是应该进入:

  • initWithNibName:bundle:
  • viewWillLayoutSubviews
  • updateViewConstraints

回答

-1

viewDidLoad是应用自定义布局的最佳位置,因为它在初始化时不会与xib约束发生冲突!

+0

错了。如果您在xib中定义的约束与您在'viewDidLoad'中定义的约束相抵触,您将会看到“无法同时满足约束”错误。 – Eric

+6

同样,你是在问一个问题,还是在测试他人的知识?你似乎比那些试图帮助你的人更了解。 – Fogmeister

+0

无法同时满足约束错误?我真的不知道这个术语,如果你知道,那么请更好地解释,然后指出某人回答消极! – Retro

1

我经常把所有的方法(或一系列方法)称为setUpConstraints或类似的东西。

然后我从viewDidLoad调用该方法。

如果你在UIView中这样做,那么我会从init方法和awakeFromNib调用我的setupConstraints方法。

既然已经为此提供了方法updateViewConstraints,那么您可以从那里调用您的setupConstraints方法。

+0

在文档中,它说约束应该在'awakeFromNib'还是'initWithFrame'中设置?我很困惑,因为[文档](https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html)说如果您的视图需要创建实现[updateConstraints]您的子视图之间的自定义约束。“ – Eric

+1

它没有。它在文档中说明了应该在哪里为数据模型创建一个数组?它没有。有一百万种不同的方式来解决编程中的相同问题。我只是提供一些。我不需要,现在我希望我没有。 – Fogmeister

+0

我的问题不是“你们如何使用自动布局”。 Apple提供了一个[查看编程指南](http://bit.ly/1aEbOez),一个[查看控制器编程指南](http://bit.ly/1eMPoKo)以及有关此事的WWDC视频。因此,虽然有一百万种不同的方式来解决编程中的问题,但有些是正确的,有些是错误的。这就是为什么我要求你证明你的答案。这就是为什么你不应该发表一个答案,如果你不能或不想证明它的理由。 – Eric