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 滚动位置设置为底部?
如何在 Objective-C 中使用继承(iOS sdk)