今天在用tableView时遇到了一个奇葩问题:不能显示最后一行。在用手势向上拉起时能看到最后一行,但松手之后最后一行就看不到了。(可能没明白我的意思,还是上图比较直接)
用手放在屏幕往上拉,能看到最后一行和后面的空行:
松手以后,最后“寒”那行就看不见了
代码如下
- (void)viewDidLoad
{
[super viewDidLoad];
self.mTableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.mTableView.dataSource = self;
self.mTableView.delegate = self;
[self.view addSubview:self.mTableView];
//省略余下无关代码
}
这里有个比较奇怪的现象,我设置的tableview的frame大小为self.view.bounds(在这里我打断点看了self.view.bounds的大小为整个屏幕的大小),但tableview在显示时是从导航栏的下面开始显示的,即从图中黑色的bar下面开始显示。这样的话tableview的整个frame就会整个往下移动一个导航栏的高度。好像也能解释为什么在松手后看不到最后一行。
解决这个问题有两种方式:
1. 一种是在初始化tableview时,设置它的frame为CGRectMake(0,0,self.bounds.width,self.bounds.height-navigationBar的高度)。这种方法比较直接,也容易理解。
2. 第二种是iOS7新引入的两个属性edgesForExtendedLayout和extendedLayoutIncludesOpaqueBars.
参见官方文档
edgesForExtendedLayout Property
The extended edges to use for the layout.
@property(nonatomic, assign) UIRectEdge edgesForExtendedLayout
Discussion
This property is only applied to view controllers that are embedded in containers, such as UINavigationController or UITabBarController. View controllers set as the root view controller do not react to this property. Default value is UIRectEdgeAll.
extendedLayoutIncludesOpaqueBars Property
A Boolean value indicating whether or not the extended layout includes opaque bars.
@property(nonatomic, assign) BOOL extendedLayoutIncludesOpaqueBars
Discussion
The default value of this property is NO.
这里把extendedLayoutIncludesOpaqueBars属性设为YES就可以解决这个问题
edgesForExtendedLayout的默认属性是UIRectEdgeAll。包含了top、bottom、left、right几个方向值。和当前问题相关的是top和bottom两个方向,所以我分别试了将extendedLayoutIncludesOpaqueBars属性设为UIRectEdgeTop和UIRectEdgeBottom两种情况。设为UIRectEdgeTop显示正常,设为UIRectEdgeBottom仍然会看不见最后一行。
所以当哪个方向有遮挡,就设置该方向。一般情况下保持edgesForExtendedLayout属性的默认值UIRectEdgeAll就可以了。
附:本人刚转行做iOS不久,今天也是第一次用tableview。第一次写博客,希望把写blog养成一个习惯。(感觉大牛都有写blog的习惯,哈哈 希望通过写blog向他们靠齐)