适当调整 UIViewController 的视图大小
Posted
技术标签:
【中文标题】适当调整 UIViewController 的视图大小【英文标题】:Proper sizing of UIViewController's view 【发布时间】:2012-01-03 03:34:54 【问题描述】:在处理了这个issue 这么多小时而没有任何运气之后,我正在尝试不同的方法,方法是在我的UIViewController
的loadView 中以编程方式创建视图。我的UIViewController
中有UIToolbar
和UITableView
,但是在将视图添加为另一个UIView
的子视图时,我在调整大小时遇到了问题。这是我到目前为止得到的:
在我的自定义 UIViewController' loadView 中:
[super loadView];
//this doesn't seem right!?!?
self.view.frame = CGRectMake(0, 0, 400, 300);
//create the Tool Bar
self.toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 45.01)];
[self.toolbar setBarStyle:UIBarStyleDefault];
[self.toolbar setAutoresizesSubviews:TRUE];
[self.toolbar setAutoresizingMask:(UIViewAutoresizingFlexibleWidth)];
// create the array to hold the buttons, which then gets added to the toolbar
NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:1];
//create buttons
UIBarButtonItem* bi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:nil];
bi.style = UIBarButtonItemStyleBordered;
[buttons addObject:bi];
//add buttons to the toolbar
[self.toolbar setItems:buttons animated:NO];
//add toolbar to the view
[self.view addSubview:self.toolbar];
//create UITableView
//a better way setting to set the frame!?!?
UITableView* listTable = [[UITableView alloc] initWithFrame:CGRectMake(0,
self.toolbar.bounds.size.height,
self.view.bounds.size.width,
self.view.bounds.size.height - self.toolbar.bounds.size.height)
style:UITableViewStylePlain];
[listTable setAutoresizesSubviews:TRUE];
[listTable setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight)];
[listTable setDataSource:self];
[listTable setDelegate:self];
self.table = listTable;
[self.view addSubview:listTable];
在rootViewController的loadView()中:
[super loadView];
controller = [[CustomViewController alloc] init];
[self.customView addSubview:controller.view];
[controller.view setAutoresizesSubviews:TRUE];
您可以在此处查看屏幕截图: https://plus.google.com/u/0/photos/112841433450419935389/albums/5693241484889252817/5693241483569881554
我是新手,除了尺寸正确之外,我是否走在正确的轨道上?
非常感谢。
编辑:
我正在尝试创建这样的视图
UIViewController UINavigationBar UIView UIView除了我将有两个 UITableView 并且没有分段按钮之外,这与我想要做的很接近。 https://plus.google.com/u/0/photos/112841433450419935389/albums/5693241484889252817/5693260341279558818
【问题讨论】:
【参考方案1】:从我可以推断出的代码中,您希望 UITableView 填满整个屏幕,但屏幕上部的条除外。 (通常 UIToolBar 在屏幕底部)
如果您将UITableViewController 用作UINavigationController 的rootViewController,您将免费获得很多不错的行为和大小。
在UINavigationController
中,屏幕顶部的栏是navigationBar
,如果需要,您可以在底部使用toolBar
:
- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated
View Controller Programming Guide for ios 是一个值得研究的好地方。
【讨论】:
文斯,请参阅上面的编辑。我不能使用 UINavigationController 因为我需要两个 UITableView 并且每个都有自己的工具栏。 @Eric,好的,从您的编辑中我看到您想将 UIViewControllers 放在其他 UIViewController 中,除非您在使用 UISplitViewController 的 iPad 上,否则可能会给您带来麻烦。通常每个屏幕都有一个 UIViewController。【参考方案2】:您做出了一些与预期使用 UIViewController 的方式相反的假设,我认为不匹配是您困惑的根源。
UIViewController 通常不管理自己的根视图的大小。他们的视图由它的容器调整大小。这意味着窗口或容器视图控制器,如 UINavigationController(或使用 iOS 5 API 的自定义容器视图控制器)管理控制器视图的框架。
尝试调整控制器的框架-loadView
不太可能产生影响,因为稍后将视图添加到窗口或父控制器的视图时,视图的框架可能会被重置。同样,控制器不应在视图加载后调整其自己的视图框架,因为这可能会与其父视图的 -layoutSubviews
行为竞争。
相反,我认为您需要一个视图控制器,其视图包含您要显示的 UITableView 和 UINavigation 栏。正如@VinceBurn 建议的那样,听起来您想要 UINavigationController 已经提供的行为。
【讨论】:
乔纳,谢谢你的回答。如果我以编程方式设置视图,我假设我需要先设置视图的布局,然后才能将根视图添加到父控制器的视图中,对吗?如果是这样,我在哪里可以这样做? 当根视图在-loadView
中构建时,您可以布局子视图,您只需要为该根视图的框架做好准备,以便稍后通过设置适当的自动调整大小掩码或在自定义上实现-layoutSubviews
UIView 子类。另请注意,如果您在 iOS 5 之前嵌套 UIViewControllers 或不使用 iOS 5 提供的子视图控制器方法,您可能会遇到意外行为。我试图在blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers 更详细地介绍这一点
感谢您的建议和分享您的帖子。我刚开始进行 iOS 开发,很难理解视图控制器的工作原理。以上是关于适当调整 UIViewController 的视图大小的主要内容,如果未能解决你的问题,请参考以下文章
UIViewController 的视图未由 viewWillAppear() 调整大小 [重复]
将 UIViewController 的视图调整为父 UIWindow 的边界