iOS 表视图控件当存在导航栏与Tabbar时内容的自动偏移
来源:互联网 发布:linux nvidia 驱动 编辑:程序博客网 时间:2024/06/06 10:39
iOS7以后苹果将导航栏与标签栏(Tabbar)改为半透明(毛玻璃效果),iOS7以前导航栏与标签栏为不透明.同时也伴随着坐标系统的变化.
在iOS7以后当我们创建一个视图,并将其y坐标设置为0,x坐标与宽高任意,如下代码
self.view.backgroundColor = [UIColor grayColor]; UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)]; redView.backgroundColor = [UIColor redColor]; [self.view addSubview:redView];
运行效果如下
大家会发现红色视图的y坐标为0时,其上半部分会被导航栏遮挡,也就意味着y坐标原点是从屏幕上边缘开始的,可以隐约透过导航栏看到红色视图的身影,没错这就是毛玻璃效果,苹果在iOS7之后特别推崇这种效果.
然后我们试着将导航栏改为不透明,观察一下红色视图的变化
UINavigationBar *navigationBar = self.navigationController.navigationBar; navigationBar.translucent = NO;我们可以通过控制导航栏的translucent属性来控制器导航栏是否透明,iOS7以后导航栏的translucent默认为YES也就是半透明,iOS7以前translucent默认为NO,导航栏为不透明.
红色视图的位置发生了变化,导航栏的颜色也变为了白色,因为此时导航栏已经不透明了,此时系统y坐标由导航栏下方开始.
那么了解了以上概念,接下来开始我们的表视图之旅把.
通常情况下,很多iOS应用为了合理的展示大量的内容,大量采用了UITableView(表视图)控件,传统的布局中一般UI界面中会同时存在Tabbar(标签栏)与NavigationBar(导航栏),用来控制界面的切换,而屏幕中间则是用表视图展现数据,而且大多数情况下,表视图会占据整个屏幕,那么如何定义表视图的宽高呢?
iOS7以前,界面中的表视图的高度通常会定义为ScreenHeight(屏幕高) - TabbarHeigth(标签栏高度 49) - NavigationBarHeight( 导航栏高度 44) - StausBarHeight(状态栏高度 20),不然的话,表视图内容可能会被遮挡.
iOS7以后其实就不需要这样了,如果非要减去导航栏和状态栏的高度的话,反而会出现莫名其妙的效果.我们完全可以这样定义表视图的宽高
UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight) style:UITableViewStylePlain]; tableView.dataSource = self; tableView.delegate = self; [self.view addSubview:tableView];我们可以直接将表视图的宽高设置为屏幕宽高,kScreenWidth与kScreenHeight分别为屏幕宽高,表视图的x,y坐标也为0,0.那么我们来看一下运行效果
也就是说,表视图的frame虽然占据整个屏幕,但其单元格内容并没有被遮挡,表视图的内容发生了自动偏移,也就是说iOS7以后,我们完全没必要减去导航栏与标签的高度,表视图会的内容会自动发生偏移.
那么表视图发生偏移的条件是什么呢?
1.当导航栏为半透明时,表视图内容会自动向下偏移64.
2.当标签栏为半透明时,表视图内容会自动向上偏移49
以上两点很好理解,iOS7以后苹果将导航栏设为半透明,那么我们在滑动视图了,用户可以通过导航栏隐约看到视图上的内容,这种特效算是iOS7以后的一大亮点,同时也是区别与iOS6的一个特点,这种用户体验要远远好于iOS6.
但是,掌握了以上两点,当我们将表视图的frame设置为屏幕大小,并确定导航栏,和标签栏均为半透明,但表视图还是被遮挡了,而且莫名其妙的是,项目中的其他地方却没事.
我们试着在控制器的视图(表视图的父视图)上再添加一个视图,并把它插入到表视图的下方.
UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight) style:UITableViewStylePlain]; tableView.dataSource = self; tableView.delegate = self; [self.view addSubview:tableView]; UIView *anyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; [self.view insertSubview:anyView belowSubview:tableView];
再看一下运行效果
此时表示图的内容被遮挡了,当把表视图的滑动最后,最后一个单元格的内容也被遮挡了,如果我们将刚才添加的view移除,表视图的内容又会重写自动偏移
那么我们此时就可以做一个总结了
iOS7以后表视图内容偏移的条件
1.导航栏为半透明,表视图会自动向下偏移64(注意当给导航栏设置backIndicatorImage时,可能会影响导航栏的透明度,(系统会根据图片的透明度值推算)
2.标签栏为半透明,表视图会自动向上偏移49(注意当给标签栏设置backIndicatorImage时,可能会影响标签栏的透明度,(系统会根据图片的透明度值推算)
3.表视图必须是第一个被添加到控制器上的视图,也就是表视图在其父视图的子视图数组中的index必须为0
我们如果将导航栏或状态栏改为不透明呢?
如果我们将导航栏设置为不透明,那么系统的y坐标将从导航栏下方开始,表视图的高度如果还是屏幕高的话,势必会出现不好的效果,那么此时你需要将高度减去64.
如果将标签栏设为不透明呢?同样我们需要将表视图的高度减去49.不然内容可能会被遮挡.
- iOS 表视图控件当存在导航栏与Tabbar时内容的自动偏移
- iOS 导航栏属性 透明属性translucent 偏移64 滑动视图内容自动向下偏移的问题总结
- ios 导航栏下的视图向下偏移64的问题 表视图
- iOS小问题——取消iOS7后视图控件预留导航栏和TabBar高度的方法
- 削去ios 7下的scrollview的contentSize有上面导航栏和下面tabbar的偏移量
- 控件内容遇到导航条出现偏移的情况
- ios 导航栏偏移
- iOS界面跳转过程中导航栏和tabBar的隐藏与显示
- iOS --统一导航栏“返回”键,并当push隐藏控制器底部tabBar
- iOS去除导航栏和tabbar的1px横线
- iOS去除导航栏和tabbar的1px横线
- iOS去除导航栏和tabbar的1px横线
- iOS去除导航栏和tabbar的1px横线
- iOS去除导航栏和tabbar的1px横线
- IOS之导航控制器与表视图
- ios 导航栏偏移-markdown版
- iOS 11 导航栏按钮偏移问题
- 7.28 UIView 剪切半径 和 ios滚动视图的自动偏移特性
- 函数的返回类型
- css 字体颜色 样式大全
- 两幅图像求和:求混合(blending)-----学习记录(3)
- leetcode--String to Integer (atoi)
- android Smali静态分析(一)
- iOS 表视图控件当存在导航栏与Tabbar时内容的自动偏移
- 【C++】纯虚函数的简单应用。
- Leetcode Sum Root to Leaf Numbers
- cogs 859 数列【线段树】
- 【leetcode】Flatten Binary Tree to Linked List
- POJ 3695 Rectangles(容斥)
- 如何在win7中使用IIS和花生壳搭建简单服务器
- 使用jekyll在github上搭建静态博客
- 【面试题】-判断单链表是否有环并找到环入口(快慢指针)