IOS TableViewStylePlain header 悬停的解决方案

来源:互联网 发布:vscode下载插件 编辑:程序博客网 时间:2024/06/13 21:34

首先 header 悬停是 UITableView tableViewStylePlain 类型自带效果,如果想去除该效果有两种解决方案可供选择
一、可以选择将 tableView 的 style 类型设置为 Group,此时 header 将不再悬停,
二、因为 TableView 继承自 UIScrollerVIew, 所以可以通过设置 ScrollerVIew 的代理解决该问题,
代码如下:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat sectionHeaderHeight = 44;
if (scrollView.contentOffset.y <= sectionHeaderHeight && scrollView.contentOffset.y >= 0) {
scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
}
else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
}
}
IOS7以前这样设置没问题(没测试,看其他博客是这样说的),
IOS7以后此处单只这样设置的话还会引起tableview 顶部head会不显示(应该是被导航栏遮挡导致),
所以还要继续解决被导航栏遮挡的问题,解决方案有三种:
(1) : 设置导航栏的透明度为不透明,然后 UI 布局时从导航栏下开始计算位置布局
(2) : 设置self.automaticallyAdjustsScrollViewInsets = NO;并同时设置 UI 布局不被导航栏遮挡,原因如下:
automaticallyAdjustsScrollViewInsets 属性是 IOS7新添加的属性设置,这个属性根据status bar,navigationbar,与tabbar的高度,自动调整scrollview的 inset,当设置为 yes 时,布局 UI frame(0, 0,100,100) 是表示从导航栏下 0开始计算.当设置为 NO 时, 布局 UI frame(0, 0,100,100) 是表示从屏幕顶部 开始计算,此时会被导航栏遮挡,所以应该设置为frame(0,64, 100, 100)
(3) : 设置edgesForExtendedLayout = UIRectEdgeNone; 也可解决导航栏遮挡问题,但是和automaticallyAdjustsScrollViewInsets有细微的差别
edgesForExtendedLayout 是设置视图延伸方向的属性,默认为UIRectEdgeAll, 当设置为UIRectEdgeAll时,frame(0,0,100,100)也是从屏幕顶部开始计算,所以此时会被导航栏遮挡,应该设置为(0,64,100,100);当设置为UIRectEdgeNone 时同automaticallyAdjustsScrollViewInsets= NO 一样,是从导航栏下开始计算高度,
这两者的区别在于,使用automaticallyAdjustsScrollViewInsets属性设置的 tableview 在向上滚动时滑出屏幕的位置为屏幕顶端,这样导致滑动时可在导航栏下看到模糊的tableView,
使用edgesForExtendedLayout设置的 tableView 滚动时滑出屏幕的位置是导航栏下边缘,即不会出现在导航栏下造成模糊,
当然通过设置导航栏透明度改变的滑出位置也是导航栏下边缘不会影响,
所以建议是优先使用透明度设置,其次是 edgesForExtendedLayout 然后是automaticallyAdjustsScrollViewInsets;
以上所有信息如有错误欢迎提问,

阅读全文
1 0
原创粉丝点击