创建始终填充可见表框架的tableHeaderView?

时间:2014-10-02 21:39:47

标签: ios objective-c uitableview uiview autolayout

我需要实现显示完全以屏幕为中心的标签的功能,而其他任何内容都不可见,但这需要在UITableView中完成。设置是UISpiltViewController,其中有一个UITableViewController用于详细视图控制器,当左边没有选择任何项目时,我想显示一条消息,说明在右侧,当用户选择一个时标签应立即消失并显示表格的项目。 (就像邮件应用程序一样。)

我已经有了这个设置并且它工作正常,但由于某种原因,它并不总是保持在屏幕中心,并且它不是一个非常好的解决方案 - 有一些小的奇怪,例如你可以部分看到顶部旋转发生时的表格。我只是创建一个UILabel,设置其frame以填充可见区域,然后将表格tableHeaderView设置为该标签,最后禁用滚动表格的功能。在轮换时,必须更新frame以再次填充可见区域。这就是奇怪发生的地方,因为直到轮换完成后它才会更新。

我的问题是,实施此行为的更好方法是什么?有什么方法可以防止在旋转后更新帧,是否可以使用tableHeaderView的自动布局?

//Setting the tableHeaderView
self.tableView.tableHeaderView = self.label;

//Creating the UILabel
- (UILabel *)label {
    _label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width,
                                                                         self.tableView.bounds.size.height
                                                                         - self.navigationController.navigationBar.frame.size.height
                                                                         - self.tabBarController.tabBar.frame.size.height
                                                                         - MIN([UIApplication sharedApplication].statusBarFrame.size.height,
                                                                               [UIApplication sharedApplication].statusBarFrame.size.width))];
    _label.text = @"Nothing Selected";
    _label.textAlignment = NSTextAlignmentCenter;
    _label.backgroundColor = self.tableView.backgroundColor;
    return _label;
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    if (_label) {
        _label.frame = CGRectMake(0, 0, self.tableView.bounds.size.width,
                                                    self.tableView.bounds.size.height
                                                    - self.navigationController.navigationBar.frame.size.height
                                                    - self.tabBarController.tabBar.frame.size.height
                                                    - MIN([UIApplication sharedApplication].statusBarFrame.size.height,
                                                          [UIApplication sharedApplication].statusBarFrame.size.width));

        self.tableView.tableHeaderView = nil;
        self.tableView.tableHeaderView = _label;
    }
}

3 个答案:

答案 0 :(得分:0)

你的细节控制器是UITableViewController吗?如果是这样,那么事情会变得更加困难,因为您添加的任何子视图(您的标签)都会成为表格的一部分。如果使用UIViewController会更容易,并在需要时交替隐藏标签或表视图。标签可以是任何大小,并使用centerX和centerY约束来使其居中。如果你这样做,你就不必在轮换上做任何事情。

答案 1 :(得分:0)

您无需将标签设置为UITableView的标题视图。

您只需将标签添加到self.view即可。即使您在UITableViewController内运行,每个UIViewController也始终具有视图属性。

将标签添加到self.view并根据需要切换标签和tableView的可见性。
这比试图在tableview中调整标签 - 层次结构要容易得多;)

修改

正如@rdelmar所指出的,UITableViewController确实没有包含tableview的单独视图,而是直接使用tableview作为它的视图。 -.-

对不起。我确实假设两个观点是分开的。

我所能说的只是关注@rdelmar的建议,并停止使用UITableViewController。它迫使你以默认的方式做事,如果你想定制它,你会有一个糟糕的时间:(

编辑2

好的,你有两个选择:

1)执行以下操作:

[_label setAutoResizingMask:(UIViewAutoResizingFlexibleWidth | UIViewAutoResizingFlexibleHeight)];

在你的标签吸气剂中。这样,您就不必再关心屏幕旋转了。标签将始终符合其父母界限。

2)使用UIViewController并将标签视为tableView的兄弟。 < - 更好的方法,但需要从当前状态进行更多重构。

答案 2 :(得分:0)

正如Cabus所指出的,解决方案是将标签的autoresizingMask设置为UIViewAutoResizingFlexibleWidth | UIViewAutoResizingFlexibleHeight。这样,标签将始终适合其父级。这可以在使用tableHeaderView的标签时完成,并且不再需要检测方向更改。