构建视图层次结构的最佳实践

时间:2013-10-18 18:13:39

标签: iphone ios objective-c

从其他堆栈溢出问题中,我了解到在视图控制器中,您可以使用 viewDidLoad 方法初始化子视图,使用 viewWillLayoutSubviews 方法来设置框架。这意味着我们需要保持视图控制器实例中所有视图的引用(如下所示)。这一切都很好,并处理设备旋转等。

UILabel* myLabel;

- (void)viewDidLoad
{
    myLabel = [[UILabel alloc] init];
    [myLabel setText:@"Hello"];
}

- (void)viewWillLayoutSubviews
{
    [myLabel setFrame:CGRectMake(0, 0, self.view.frame.size.width, 21)];
}

我的问题是,如果你有一个复杂的子视图层次结构。例如,如果您有一个UIView的子视图并且您将子视图添加到该UIView(甚至可能更深入),该怎么办?您是否必须在整个视图层次结构中保留对每个视图的引用,以便在 viewWillLayoutSubviews 上,您可以修改每个视图的框架?这似乎是唯一的方法。约束是否是最佳方式,因此您不必经常修改框架?是否是构建大量自定义UIViews的最佳答案,以便在每个自定义视图中管理此层次结构更易于管理和自包含?

希望这是一个足够明确的问题......提前谢谢。

2 个答案:

答案 0 :(得分:1)

无论何时操纵视图或子视图,都可以改变布局约束,你必须调用

[view layoutSubviews];

这将使用新属性设置重新制作约束。加载viewController时,您将设置所有不处理框架或边界的属性,然后在viewWillLayoutSubviews中设置视图的框架,以便制定所有约束并确保满足它们。

您在故事板中放置的任何对象都应该具有一个属性,该属性将包含对该对象的引用。这是一个很好的编码实践,特别是如果你遵循测试驱动开发的规则。

现在回答你的问题,如果你在故事板中创建了复杂的层次结构,那么一切都应该没问题,只要你的约束条件很好,如果你在代码中做到这一点,那么一定要调用layoutSubviews addSubview 示例:

UIView* view1 = [[UIView alloc] initWithFrame:CGRectZero];
UIView* view2 = [[UIView alloc] initWithFrame:CGRectZero];
[view1 addSubview:view2];
[view1 layoutSubviews];

更多视图不会使结构更好,但如果您有100个子视图......让我们真实......需要在单独的视图中对某些内容进行分类..

使用约束可以完美地定义视图框架。您可能不会首先注意到这些差异,但如果将其与自动调整蒙版进行比较,则会看到差异。此外,这里还有一个明确向您展示差异的指南。

LayoutConstraints and Autolayout

答案 1 :(得分:1)

如果您希望划分某些逻辑和重用组件,还值得考虑使用子视图控制器。