layoutSubviews 详解

layoutSubviews 详解ios layout机制相关方法-(CGSize)sizeThatFits:(CGSize)size-(void)sizeToFit——————–(void)layoutSubviews-(void)layoutIfNeeded-(void)setNeedsLayout——————–-(void)

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

ios layout机制相关方法

  1. – (CGSize)sizeThatFits:(CGSize)size
  2. – (void)sizeToFit

——————-

  1. – (void)layoutSubviews
  2. – (void)layoutIfNeeded
  3. – (void)setNeedsLayout

——————–

  1. – (void)setNeedsDisplay
  2. – (void)drawRect

layoutSubviews在以下情况下会被调用:

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事件

在苹果的官方文档中强调:

      You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.

 layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。

反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。

 刷新子对象布局

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秒后重绘

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159914.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • RenderControl输出html遇到的问题

    RenderControl输出html遇到的问题当我直接在后台用GridView gv=new GridView();gv.RenderControl(htmlwrite);没有问题,但是如果我从工具直接拖一个GridView到设计页面,在后台gv.RenderControl(htmlwrite);就会出现Control GridViewTotal of type GridView must be placed inside a f

  • Maskrcnn中resnet50改为resnet34「建议收藏」

    Maskrcnn中resnet50改为resnet34「建议收藏」因需要训练的数据集并不复杂,resnet50的结构有点冗余,于是就把maskrcnn的backbone从resnet50改为resnet34结构。找到model文件,将resnet50部分代码做一定的修改,就可以得到resnet34的相关代码下面是相关代码:##con_block修改为conv_block0并添加到model文件中defconv_block0(input_tensor…

  • gcc基本命令_cmake 命令

    gcc基本命令_cmake 命令介绍GCC(英文全拼:GNUCompilerCollection)是GNU工具链的主要组成部分,是一套以GPL和LGPL许可证发布的程序语言编译器自由软件,由RichardStallman于1985年开始开发。GCC原名为GNUC语言编译器,因为它原本只能处理C语言,但如今的GCC不仅可以编译C、C++和Objective-C,还可以通过不同的前端模块支持各种语言,包括Java、Fortran、Ada、Pascal、Go和D语言等等。编译过程GC

    2022年10月13日
  • 中国电信修改光猫路由模式为桥接模式怎么改_打10000改电信光猫桥接模式

    中国电信修改光猫路由模式为桥接模式怎么改_打10000改电信光猫桥接模式首先,需要搞到超级管理员的账号和密码,可以上网根据光猫型号查找,也可以直接跟安宽带的工作人员要.第一步:准备超级管理员账号和密码.可以自行根据光猫型号搜索,也可以直接跟安宽带的工作人员要.第二步:使用超级管理员账密登录网关管理页面(光猫)一般为192.168.1.1(前提你的路由模式为路由模式,而不是桥接模式)第三步:修改光猫参数1:连接名称修改改为3_INTERNET_R_VID_412:连接模式修改为桥接3:保存第四步:使用路由器拨号宽带账号和密码一般都会贴在光猫上,如果丢失了

  • ADRC控制matlab仿真,关于ADRC的一些基本例子仿真

    ADRC控制matlab仿真,关于ADRC的一些基本例子仿真1.jpg10.jpg2.jpg3.jpg4.jpg5.jpg50-100.jpg6.jpg7.jpg8.jpg9.jpgADGR.mADRC100-50.jpgADRC30-15.jpgADRC30-50.jpgADRC50-100.jpgADRC50-30.jpgADRC_AG.mADRC_PSO.asvADRC_PSO.mAdaptiveProbabilitiesofCrossover…

  • 激活码pycharm_通用破解码

    激活码pycharm_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号