UITableview布局 消除顶部空白contentInset

news/2025/5/30 5:19:18

UITableview布局 消除顶部空白contentInset

1. 现象

在使用tableview的时候,你是否遇到下面的问题,如下图左边,将一个tableview加入到self.view中,设置其frame的y值为导航栏家状态栏高度64,self.view的背景色为红色,tableview的背景色为黄色,tableviewcell的背景色为绿色。
运行的结果是:tableview的cell并没有从tableview的顶部开始,为什么为出现这种情况,我们并没有设置headerview啊?
同样的设置,在UIScrollview中也是相同的结果,如下图右。其中灰色view的frame为0,0,100,100.


屏幕快照 2016-01-09 下午4.17.47.png

2. 分析

至于为何会发生上面的情况,本人还没有弄清楚,但是解决方法是有的,而且很简单。UIScrollview有个contentInset属性,大家都知道吧,UItableview继承自它,也有该属性,上面的情况是不是很像给其其属性赋值了(64,0,0,0)。
我们打印tableview和scrollview的contentinset之后,的确如此:
{64, 0, 0, 0}

3. 解决方法

3.1 contentinset=uiedgeinsetzero

所以解决方法就是,人为的改变其contentinset=uiedgeinsetzero。但是需要注意的是,该代码写的位置是有讲究的,我所写的这个demo,该行代码写在viewWillAppear里面是无效的。也就是说,尽管在viewwillappear里面设置其contentinset为UIedgeinsetzero,但是在viewdidappear里面打印的结果仍然是{64,0,0,0)。
而在viewdidappear和viewdielayout里面设置该属性后,就可以达到想要的结果,而且在viewdidappear里面打印的该属性的确是{0,0,0,0}。
因为本人的测试并不系统,上面的结果不能算是一个确切的结论,因为我们不不能确定出现这样的现象到底是有什么因素决定的。
针对该代码的位置的问题,个人猜测这个和view的布局时机有关。
下图是设置后的效果:


Simulator Screen Shot 2016年1月9日 下午4.38.05.png

3.2 self.automaticallyAdjustsScrollViewInsets = NO;

这里的self指的是当前controller,从该属性字面就可以看出,禁用其自动调整scrollview的inset属性。
同样该代码的位置也是有讲究的:放在viewdidload和viewwillappear里面是有效的,而放在viewWillLayoutSubviews 和 viewdidlayoutsubviews 以及 viewdidAppear里面是无效的。

3.3 self.navigationController.navigationBar.translucent = NO;

从字面意思看,该属性设置的是navigationBar的透明属性,默认是YES,设置为NO后,就出现下面图中的现象:
scrollview的contentinset恢复为zero了,但是self.view(红色的view)距离navigationbar有64的间隙。也就是说navigationbar的透明属性去掉后,self.view从navigationBar的底部开发布局了,这其实和iOS6到iOS7之后苹果的一个改进(这个是面试经常被问到的)。
可以看出虽然消除了scrollview的contentinset,但是self.view的位置也想要的改变了,所以在使用的时候要慎重。
同样,改代码的位置也是有讲究的,在viewdidLoad 和 viewwillappear里面有效,在viewwilllayoutsubviews viewdidlayoutsubviews viewdidappear里面无效。


Simulator Screen Shot 2016年1月9日 下午4.46.24.png

4. 总结

  1. 有三种方法可以解决上述问题
  2. 三种方法代码的位置有讲究
  3. 本demo并不科学,不系统,所以得出的结论并不一定正确
  4. 该现象什么情况下出现,或者其受什么因素影响,本人并不清楚,如有哪位童鞋知道,欢迎告知。
  5. 好像还有其它方法可以解决该问题,本人并没有做过测试,可以参考下面的链接。

文章来源:https://blog.csdn.net/Keep_Moving31038/article/details/78356393
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-43266.html

相关文章

UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法

首先&#xff0c;视图控制器必须得实现协议UIAlertViewDelegate中的方法&#xff0c;并指定delegate为self&#xff0c;才能使弹出的Alert窗口响应点击事件。 具体代码如下&#xff1a; ViewController.h中的代码如下&#xff1a; #import <UIKit/UIKit.h> interface …

SwiftUI 从 Firebase 实时数据库中获取数据(教程含源码)

介绍 在查找 Firebase 教程时,我们经常会找到与 Firestore 或身份验证 SDK 相关的文章。它忘记了他们的实时数据库,它可以很容易地使用 JSON 文件导入我们的数据。 在本教程中,我们将导入一个包含鸟类列表的 JSON 并使用 Firebase SDK 读取它,让我们开始吧! 创建一个新…

8.15.2. Array Value Input

8.15.2. Array Value Input8.15.2.数组值输入To write an array value as a literal constant, enclose the element values within curly braces and separate them by commas. (If you know C, this is not unlike the C syntax for initializing structures.) You can put d…

UI工具-阿里巴巴矢量图标库

各种UI图库&#xff1a; 点击打开链接

如何在 Python 中使用 Plotly 创建太阳系的 3D 模型 (教程含源码)

Python中有大量的图形库可供您绘制所有主要类型的图表,以便可视化您的数据。但是,您有没有考虑过将它们用于更复杂的事情?将 Matplolib 和 Bokeh 放在一边,潜入可以使用Plotly创建的 3D 和动画图形的美妙世界。 我与 Plotly 没有任何关联,但我在 Python 中使用他们的库已经…

IOS 系统API---NSJSONSerialization四个枚举什么意思

IOS 系统API---NSJSONSerialization四个枚举什么意思 NSJSONReadingMutableContainers&#xff1a;返回可变容器&#xff0c;NSMutableDictionary或NSMutableArray。 NSJSONReadingMutableLeaves&#xff1a;返回的JSON对象中字符串的值为NSMutableString&#xff0c;目前在iOS…

8.15.3. Accessing Arrays

8.15.3. Accessing Arrays 8.15.3.访问数组 Now, we can run some queries on the table. First, we show how to access a single element of an array.This query retrieves the names of the employees whose pay changed in the second quarter: 现在&#xff0c;让我们…

swift之属性观察 (willSet和didSet)

属性观察器控制和响应属性的变化&#xff0c;当属性被设置的时候回调用属性观察器&#xff0c;主要有以下几个特点&#xff1a;属性改变之前触发willSet方法&#xff0c;属性改变之后触发didSet方法 在给属性添加观察者之前必须要明确申明属性的类型&#xff0c;否则编译器会报…

李洪强iOS开发之代理

如果A想让控制器B为他做事情 用代理的话 首先: 在A的.h文件中: 其次A的.m中 在控制器的.m文件中: 还是在控制器B的.m文件中 在A初始化的那一刻设置控制器B为A的代理 在B的.m中实现代理方法 转载于:https://www.cnblogs.com/LiLihongqiang/p/5685329.html

Python 3D之如何使用 Python Plotly 可视化交互式 3D 网络(教程含源码)

在这个数据的黄金时代,数据素养是最需要的技能之一。那里的每家公司都在尝试收集更多数据,数据集现在很容易(并且越来越多地)在线提供给公众,并且各种软件正在以极快的速度生产数据。 由于这种现象,可视化和理解所有这些数据的能力(数据素养)现在是一项非常宝贵的技能…