很久没有写视图布局,最近发现写布局很不顺手,总结一下在处理UIScrollview的时候种种注意事项:

1.

self.automaticallyAdjustsScrollViewInsets = NO;

iOS7之后,当你在Nav上添加TableView的时候,你会发现tableView的位置并不是从你的起点开始的 ,这是因为在iOS7之后,如果nav上添加的第一个视图是UIScrollView的时候,系统会默认添加上64的间隔,解决方法是  你把第一个视图添加一个0.1的View使SCrollView成为第二个视图,或者取消系统默认效果.。

2.

关于layoutsubviews 和 setNeedsLayout, layoutIfNeeded

最近我在一个controller上面添加了一个controller,子controller上面是一个tableview,我需要获取tableview的偏移量来赋值给父类controller上滚动视图,使父类视图能够正常滑动。由于重新赋值了子类的frame,所以我预先标记了tableview:

   [self.historyInfoVc.tableview layoutIfNeeded];

  发现位置并非想象的那样,tableview进行了重新布局,但是子类控制器的view并未进行重新布局,这导致我的视图上出现了两个tableview错乱排列的情况,具体为什么出现这种情况我也不是很清楚。后来我把重新布局的属性改为了子类控制器的view,子类控制器的view在重新布局的时候一定会连并subviews一起布局,发现果然可行。关于这三个属性在此进行说明如下:

1、init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发

2、addSubview会触发layoutSubviews

3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化

4、滚动一个UIScrollView会触发layoutSubviews

5、旋转Screen会触发父UIView上的layoutSubviews事件

6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件 

刷新子对象布局

-layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写
-setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用
-layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews) 如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局 在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded] 重绘 -drawRect:(CGRect)rect方法:重写此方法,执行重绘任务
-setNeedsDisplay方法:标记为需要重绘,异步调用drawRect
-setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘 sizeToFit会自动调用sizeThatFits方法; sizeToFit不应该在子类中被重写,应该重写sizeThatFits sizeThatFits传入的参数是receiver当前的size,返回一个适合的size sizeToFit可以被手动直接调用 sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己 ———————————- layoutSubviews对subviews重新布局 layoutSubviews方法调用先于drawRect setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded方法应该是这样的 layoutIfNeeded遍历的不是superview链,应该是subviews链 drawRect是对receiver的重绘,能获得context setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60hz
,也就是1/60秒后重绘 

3.contentsize

也许你并未发现这东西能出现什么问题,但是作为scrollview来讲,在存在约束的情况下,或者你已经摸不着头脑了。

在官方文档上有这么一句话:

scrollView使用自动约束是要特别小心,使用自动约束之后,scrollView.contentSize会根据它的subviews来进行计算,
所以一定要保证添加到scrollView里的subview的宽高是可以确定的值,并且要和scrollView的edge进行正确的约束

也就是说如果你在给scrollview添加子控件的时候,如果是使用约束来实现的话,那么你就需要⚠️,通常,如果不需要适配横屏的话我就直接添加frame;

4.contentinset

其实很好理解,就是scroview的显示内容距离该scrollview的间距。但是我在设置的时候发现下和右都无法正常使用,查了很多资料也找不到其中缘由?知道的伙伴请指教,不胜感激!

  

UIScrollview的 约束 contentsize contentoffset contentinset layoutsubviews needlayout等影响布局的属性的更多相关文章

  1. iOS开发frame, contentSize, contentOffset, contentInset 区别联系浅析

    1. 概述 iOS开发中,必然会涉及到布局相关问题,frame,bounds,contenSize,contentOffset,contentInset这几个布局相关概念让许多初学者感到困惑.虽然初步 ...

  2. scrollView的几个属性contentSize contentOffset contentInset

    01-  ontentSize是scrollview可以滚动的区域 比如frame = (0 ,0 ,320 ,480) contentSize = (320 ,960), 代表你的scrollvie ...

  3. UIScrollView控件及其三个常用属性:contentSize、contentInset和contentOffset

    如果您对UIScrollView控件感到难以理解,下面是本人自己对UIScrollView控件的理解方式,按照我的思路,理解UIScrollView控件非常容易! 我对UIScrollView的构成理 ...

  4. contentOffset、contentSize和contentInset

    1.UIScrollView@property(nonatomic)CGPoint contentOffset;这个属性用来表示UIScrollView滚动的位置 @property(nonatomi ...

  5. contentSize、contentInset和contentOffset的区分

    一.  frame.bounds和center的区分 frame:由左边原点和矩形面积组成,其中原点代表其在父视图中的起点位置. bounds:就是原点始终为(0,0)的frame. center:本 ...

  6. contentSize、contentInset和contentOffset区别

    contentSize.contentInset和contentOffset区别 分类: iphone开发2011-12-05 21:49 23495人阅读 评论(4) 收藏 举报 uiviewios ...

  7. contentSize、contentInset和contentOffset

    contentSize.contentInset和contentOffset 是 scrollView三个基本的属性. contentSize: The size of the content vie ...

  8. contentSize、contentInset和contentOffset 是 scrollView三个基本的属性区别和使用

    contentSize.contentInset和contentOffset 是 scrollView三个基本的属性. contentSize: 其实就是scrollview可以滚动的区域,比如fra ...

  9. Storyboard中使用UIscrollView添加约束的开发总结

    第一次在项目中用storyboard做界面,一般的界面直接添加约束非常爽快 然后有个界面有scrollview,添加了约束还总是出错 刚开始使用了 wCompact,hRegular,滑动出现问题,有 ...

随机推荐

  1. 新C# 操作Excel属性

    C# 操作Excel属性 数字(Range.NumberFormatlocal 属性) 常规:Range.NumberFormatlocal = "G/通用格式" 数值:Range ...

  2. maven ----> 子工程中引入父工程

    创建父工程,打包方式指定为 pom <groupId>com.example</groupId> <artifactId>SleuthMain</artifa ...

  3. Kaggle泰坦尼克数据科学解决方案

    原文地址如下: https://www.kaggle.com/startupsci/titanic-data-science-solutions --------------------------- ...

  4. 跨站请求伪造 CSRF

    原理 CSRF攻击原理比较简单,例如Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户.用户C打开浏览器,访问受信任网站A,输入用户名和密码请 ...

  5. FreeBSD之基本配置

    1. 设置IP地址.网关ee /etc/rc.conf ifconfig_em0="inet 192.168.21.173 netmask 255.255.255.0"   #设置 ...

  6. LeetCode--003--无重复字符的最长子串(java)

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  7. 2 爬虫 requests模块

    requests模块 Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,Requests它会比urllib更加方便,reques ...

  8. Docker 镜像上传到docker hub仓库

    1 先创建docker hub 帐号 ,并创建仓库 https://hub.docker.com/ 首先你需要一个docker hub 帐号,记住username,password,email .后面 ...

  9. 4.1.4 Nim

    Problem description: 有n堆石子,每堆各有ai颗石子.A和B轮流从非空的石子堆中取走至少一颗石子.A先取,取光所有石子的一方获胜.当双方都采用最佳策略时,谁会获胜? 1<=n ...

  10. MySql之行记录的详细操作,创建用户以及库表的授权

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...