iOS 如何在显示之前设置 ViewController 视图框架?

Posted

技术标签:

【中文标题】iOS 如何在显示之前设置 ViewController 视图框架?【英文标题】:How did iOS set UIViewController's view frame before shown? 【发布时间】:2012-05-30 16:05:55 【问题描述】:

我不熟悉ios UIViewController 的详细实现。我有以下代码来创建一个新的 UIViewController 并显示它,但是我在 initWithFrame 方法中设置的框架不起作用,控制器的视图总是全屏(320*480)。

UIViewController *viewController = [[UIViewController alloc] init];

// view
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 140, 130)];
viewController.view = view;
[view release];
AppController *app = (AppController*)[[UIApplication sharedApplication] delegate];

UINavigationController *nav = [app navController];
[nav pushViewController:viewController animated:YES];
 [viewController release];

我在苹果开发者文档中搜索相关想法,但没有发现任何有用的信息。 UIViewController 在显示之前是如何处理它的 view frame 属性的?我在哪里可以找到有用的文档。

谢谢。


更新:其实代码来自cocos2d-iphone DirectorTest:https://github.com/cocos2d/cocos2d-iphone/blob/release-2.0-rc1/tests/DirectorTest.m#L143

【问题讨论】:

您确定看不到下面的导航控制器视图吗?您是否尝试过为背景设置自定义颜色?另外你的导航是错误的。如果此代码在视图控制器中 - 使用 self.navigationController 到达导航控制器并将新的视图控制器推送到它上面。 @Eimantas 我更新了,这段代码来自 cocos2d 测试,运行正常,视图全屏显示,即使它的 frame 设置为 (0, 0, 160, 240) 这段代码只是一个写得很糟糕的测试用例,不应该在实际应用程序中使用。但是,请注意视图框架可能会根据自动调整大小的遮罩而改变。 【参考方案1】:

这一切都错了 - 你真的需要阅读(并理解)Apple 的 UIViewController 文档:

View Controller Catalog

View Controller Programming Guide

View Controller Reference

如果您在代码中为视图控制器创建视图,您应该在视图控制器的 loadView 方法中进行。

直接来自 Apple 的文档:

以编程方式创建视图

如果您更喜欢以编程方式创建视图... 您可以通过覆盖视图控制器的 loadView 来实现 方法。您对此方法的实现应执行以下操作:

创建一个根视图对象。根视图包含所有其他视图 与您的视图控制器相关联。您通常定义框架 让这个视图匹配应用程序窗口的大小,它本身应该 填满屏幕。但是,框架会根据您的视图进行调整 显示控制器。请参阅“视图控制器视图大小调整”。

您可以使用通用 UIView 对象、您定义的自定义视图或任何 其他可以缩放以填满屏幕的视图。

创建额外的子视图并将它们添加到根视图。对于每个 看来,你应该做到以下几点:

创建并初始化视图。对于系统视图,您通常使用 initWithFrame: 方法指定初始大小和位置 风景。使用 addSubview: 方法将视图添加到父视图。 将根视图分配给视图控制器的视图属性。

【讨论】:

谢谢。但是你能解释一下代码吗:github.com/cocos2d/cocos2d-iphone/blob/release-2.0-rc1/tests/… 它不使用 loadView 方法,而是将视图分配给控制器。为什么会起作用? 他们也不知道自己在做什么?

以上是关于iOS 如何在显示之前设置 ViewController 视图框架?的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin Forms iOS 中出现 ListView 之前,如何将 ListView 滚动位置设置为底部?

iOS开发之点击tableViewCell,显示详情

iOS-如何在代码开始之前显示 alertView

如何在 Objective-C 中使用继承(iOS sdk)

如何从情节提要中获取 UIViewControl 对象的笔尖名称

如何在请求会话之前检测用户是不是有 iOS 集成 Facebook 帐户设置?