gpt4 book ai didi

iphone - 在哪里确定 UIView 大小

转载 作者:行者123 更新时间:2023-12-03 18:16:29 27 4
gpt4 key购买 nike

摘要:在初始化 View 时,UIViewController 应该如何知道其 UIView 实例的大小?

UIView 的专用初始化方法是 initWithFrame:(CGRect)frame 方法。这为新创建的 UIView 设置了框架。如果请求该 View Controller 的 View ,则可以从 UIViewController 的 loadView 方法调用此方法。 UIViewController 的文档说明了子类化和 View 大小:

When creating the views for your view hierarchy, you should always set the autoresizing properties of your views. When a view controller is displayed on screen, its root view is typically resized to fit the available space, which can vary depending on the window’s current orientation and the presence of other interface elements such as the status bar.

因此,UIViewController 实例应该设置这些属性。到目前为止一切顺利,UIViewController 到目前为止不必知道其 View 有多大或将有多大。

当请求 UIViewController 的 View 且 view 属性为 nil 时,将调用 View Controller 的 loadView 方法。现在有一个问题,因为 UIView 需要初始化,但 View Controller 仍然不知道 View 应该是什么大小。您应该初始化该 View 有多大?您在代码中的何处确定 View 大小?

您可以使用零矩形 (CGRectZero) 初始化 View :

- (void)loadView {
self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
}

并让调用者像这样设置 View 框架:

UIViewController *viewController = [[MyUIViewController alloc] init];
// next two lines are normally combined, but for clarity they are not now
UIView *view = viewController.view;
view.frame = CGRectMake(0, 0, 200, 200);

这会从 View Controller (viewController.view) 请求 View ,从而使用 loadView 方法加载其 View 。此 loadView 方法使用 CGRectZero 初始化 View 。然后调用者设置其框架(view.frame = ...)

问题是 View 上的frame属性设置了两次,如果您的自定义UIView在setFrame方法中执行一些高级布局(例如放置和调整 subview 的大小),可能会导致更多的双重工作)。您可以通过为 UIViewController 创建一个专用的初始化方法来防止这种情况,该方法已经向调用者询问了 CGRect,您将其存储在 ivar 中。调用 loadView 方法时,您可以使用此 ivar 创建 View 。

去这里的好方法是什么?设置 View 的框架两次(使用CGRectZero初始化,然后设置),或者为UIViewController提供一个带有CGRect的新初始化方法(从而为其提供一个框架属性) ?或者我错过了什么并且还有其他可能性吗?

最佳答案

您不必必须使用指定的初始值设定项。只需像 [[UIView alloc] init] 中那样使用 init 即可。必须从子类的初始化器中使用指定的初始化器。

另一方面,两次设置框架应该不会造成太大伤害。在 setFrame: 中执行大量任务是不寻常的。布局通常在 layoutSubviews 中完成,并且仅执行一次。

关于iphone - 在哪里确定 UIView 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1103089/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com