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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于LLDP

    关于LLDPLLDP是LinkLayerDiscoveryProtocol链路层发现协议的简称,几乎所有以太网交换机都内置了这个功能。LLDP的大致原理如下:1交换机定期通过LLDP报文对外广播自己的设备类型、端口编号等信息,交换机不会转发LLDP报文,但是会在链路上侦听其他设备发送过来的LLDP数据,并在一定时限的有效期内存储在交换机MIB中,可以供SNMP查询,进而掌握自己邻居的大致情况。

    2022年5月28日
    175
  • python语言程序设计教程赵璐主编_一加6第三方ROM推荐

    python语言程序设计教程赵璐主编_一加6第三方ROM推荐从数据处理到人工智能python数据分析方向第三方库有:Numpy,SciPy,PandasPython数据可视化方向的第三方库有:Seaborn,Matplotblib,Mayavi,Bokeh,Gleam,Plotly,visoy,ggplot,geoplotlib,pygal,Arcade,missingno,dataswimPython文本处理方向…

    2022年10月14日
    0
  • QT5 使用QCustomplot绘制频谱瀑布图并封快速傅里叶变换fft类

    QT5 使用QCustomplot绘制频谱瀑布图并封快速傅里叶变换fft类近期想要做个上位机显示SDR设备的信号频谱,频谱瀑布图展示最为直观,经过多方评估比较最后选择了QCustomsplot图形库,相比于其他选择比如修改RGB像素刷新图片来说这种方式要简单的多,先做了个demo出来试试效果,话不多说先上动图。下面介绍方方法:第一步,QT没有自带QCustomplot库需要自行下载,实际上就是一个qcustomplot.h和qcustomplot.cpp文件,添加进工程就可以了,不想下载的后面我会上传de…

    2022年10月16日
    0
  • 常量和常量表达式_里伯德常量

    常量和常量表达式_里伯德常量常量和常量表达式 long型常量以L或者l结尾,有时候,如果一个整数太大无法用int表达,也被当做long型; 无符号常量以U或者u结尾,unsignedlong型常量以UL或者ul结尾; 没有后缀的浮点数常量为double型; 有后缀F或者f的浮点数常量是float型,后缀L或者l表示longdouble型常量; 八进制和十六进制的常量也可以使用L和U后缀;

    2022年9月29日
    1
  • 数据结构面试题以及答案整理[通俗易懂]

    数据结构面试题以及答案整理[通俗易懂]一、什么是数据结构?数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。结构包括逻辑结构和物理结构。数据的逻辑结构包括4种(1)集合:数据元素之间除了有相同的数据类型再没有其他的关系(2)线性结构:数据元素之间是一对一的关系——线性表、栈、队列(3)树形结构:数据元素之间是一对多的关系(4)图状结构:数据元素之间是多对多的关系。物理结构包括顺序存储结构和链式存储结构。二、解释一下顺序存储与链式存储顺序存储结构是用一段连续的存储空间来存储数据元

    2022年9月19日
    1
  • JSP的七大动作和三大指令

    JSP的七大动作和三大指令JSP的七大动作和三大指令

    2022年4月22日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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