iphone - 构建 View 层次结构的最佳实践

标签 iphone ios objective-c

从其他堆栈溢出问题中,我了解到在您的 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 进行比较,您就会发现差异。此外,这里有一个指南,它公然向您展示了差异。

LayoutConstraints and Autolayout

关于iphone - 构建 View 层次结构的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19456396/

相关文章:

iphone - 如何将联系人列表从 iPhone 通讯录导入到我的应用程序?

android - 迁移到 Cloud Endpoints Framework v2,iOS 客户端

ios - 使用新的身份验证重新启动 RKObjectRequestOperation

ios - Objective-C - 即使应用了 sqlite3_close(),sqlite3_open 内存泄漏

ios - 如何从聚光灯搜索中启动该应用程序?

ios - 如何在 iOS 8.0+ 中以编程方式打开设备设置应用程序而不是应用程序设置

iphone - Xcode 慢得令人难以忍受(而且是谎言)。为什么?

iphone - 显示 iPhone 键盘

iphone - 当我点击表格 View 中的第一个单元格时,不会触发 didSelectRowAtIndexPath

ios - Xcode 构建但启动应用程序时黑屏