我需要实现显示完全以屏幕为中心的标签的功能,而其他任何内容都不可见,但这需要在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;
}
}
答案 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
的标签时完成,并且不再需要检测方向更改。