适当调整 UIViewController 的视图大小

Posted

技术标签:

【中文标题】适当调整 UIViewController 的视图大小【英文标题】:Proper sizing of UIViewController's view 【发布时间】:2012-01-03 03:34:54 【问题描述】:

在处理了这个issue 这么多小时而没有任何运气之后,我正在尝试不同的方法,方法是在我的UIViewController 的loadView 中以编程方式创建视图。我的UIViewController 中有UIToolbarUITableView,但是在将视图添加为另一个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 的视图奇怪的调整大小行为

调整 UIViewController 中的视图大小

UIViewController 的视图未由 viewWillAppear() 调整大小 [重复]

将 UIViewController 的视图调整为父 UIWindow 的边界

父 UIViewController 调整容器视图大小时,子视图控制器不自动布局

调整UIViewController的大小以导出其视图