从其他堆栈溢出问题中,我了解到在您的 View Controller 中,您可以使用 viewDidLoad 方法来初始化 subview ,并使用 viewWillLayoutSubviews 方法来设置框架。这意味着我们需要在 View Controller 实例中保留所有 View 的引用(如下所示)。这一切都很好,可以处理设备旋转等。
UILabel* myLabel;
- (void)viewDidLoad
{
myLabel = [[UILabel alloc] init];
[myLabel setText:@"Hello"];
}
- (void)viewWillLayoutSubviews
{
[myLabel setFrame:CGRectMake(0, 0, self.view.frame.size.width, 21)];
}
我的问题是,如果您有复杂的 subview 层次结构怎么办。例如,如果您有一个 UIView 的 subview ,并且您将 subview 添加到该 UIView(甚至可能更深),该怎么办?您是否必须保留对整个 View 层次结构中每个 View 的引用,以便在 viewWillLayoutSubviews 上,您可以修改每个 View 的框架?这似乎是唯一的方法。约束是最好的方法,这样您就不必经常修改框架了吗?构建大量自定义 UIView 以使管理此层次结构更易于管理且在每个自定义 View 中独立的最佳答案是什么?
希望这是一个足够明确的问题..提前致谢。
最佳答案
任何时候你操纵一个 View 或 subview ,以一种可能改变布局约束的方式,你必须调用
[view layoutSubviews];
这将使用新的属性设置重新制作约束。加载 viewController 时,您将设置所有不处理框架或边界的属性,然后在 viewWillLayoutSubviews 中设置 View 的框架,这样就可以制定所有约束并确保它们得到满足。
您放入 Storyboard 中的任何对象都应该有一个属性,该属性将保存对该对象的引用。这是一种很好的编码习惯,尤其是在您遵循测试驱动开发规则的情况下。
现在回答你的问题,如果你在 Storyboard 中创建了复杂的层次结构,那么只要你的约束很好,一切都应该没问题,如果你在代码中制作它,只要确保在调用时调用 layoutSubviews 添加 subview 示例:
UIView* view1 = [[UIView alloc] initWithFrame:CGRectZero];
UIView* view2 = [[UIView alloc] initWithFrame:CGRectZero];
[view1 addSubview:view2];
[view1 layoutSubviews];
更多的 View 并不能使结构更好,但是如果你有 100 个 subview ......让我们真实......需要在单独的 View 中分类......
约束让您可以完美地定义 View 的框架。一开始您可能没有注意到差异,但如果将其与 Autoresizing Mask 进行比较,您就会发现差异。此外,这里有一个指南,它公然向您展示了差异。
关于iphone - 构建 View 层次结构的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19456396/