layoutSubviews总结

layoutSubviews总结ioslayout机制相关方法-(CGSize)sizeThatFits:(CGSize)size-(void)sizeToFit——————–(void)layoutSubviews-(

大家好,又见面了,我是你们的朋友全栈君。

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/154608.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月1日 下午4:46
下一篇 2022年7月1日 下午4:46


相关推荐

  • Raspberry Pi (树莓派)折腾记之一

    Raspberry Pi (树莓派)折腾记之一那么什么是RaspberryPi?RaspberryPi是一款针对电脑业余爱好者、教师、小学生以及小型企业等用户的迷你电脑,预装Linux系统,体积仅信用卡大小,搭载ARM架构处理器,运算性能和智能手机相仿。在接口方面,RaspberryPi提供了可供键鼠使用的USB接口,此外还有快速以太网接口、SD卡扩展接口以及1个HDMI高清视频输出接口,可与显示器或者TV…

    2025年5月23日
    8
  • FRP内网穿透教程「建议收藏」

    FRP内网穿透教程「建议收藏」FRP内网穿透介绍frp是一个专注于内网穿透的高性能的反向代理应用,支持TCP、UDP、HTTP、HTTPS等多种协议。可以将内网服务以安全、便捷的方式通过具有公网IP节点的中转暴露到公网。为什么使用frp通过在具有公网IP的节点上部署frp服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:客户端服务端通信支持TCP、KCP以及Websocket等多种协议。采用TCP连接流式复用,在单个连接间承载更多请求,节省连接建立时间。代理组间的负

    2025年11月9日
    4
  • 0基础可学!2026年AI智能体课程来啦:手把手教你搭建智能体(Agent)、智能体工具变现

    0基础可学!2026年AI智能体课程来啦:手把手教你搭建智能体(Agent)、智能体工具变现

    2026年3月17日
    3
  • Centeros常用命令

    Centeros常用命令常用命令1.su切换到管理员权限,输入密码2.cd/home进入到home文件夹3.touchlss0555创建文件夹lss05554.ls该目录的所有文件5.退出vim编辑模式ESC+ZZ6.tar-zxv-fxx.zip解压压缩文件7.mvxx….

    2025年7月14日
    3
  • STM32F103C8T6单片机简介

    STM32F103C8T6单片机简介TheSTM32F103xxmedium-densityperformancelinefamilyincorporatesthehigh-performanceARMCortex-M332-bitRISCcoreoperatingata72MHzfrequency,high-speedembeddedmemories(Flashmemoryupto128KbytesandSRAMupto20Kbytes),andanextensive

    2022年4月25日
    60
  • rsyslog配置_ssh host key verification fail

    rsyslog配置_ssh host key verification fail1.rsyslog介绍Rsyslog的全称是rocket-fastsystemforlog,它提供了高性能,高安全功能和模块化设计。rsyslog能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog可以提供超过每秒一百万条消息给目标文件。特点:多线程 可以通过许多协议进行传输UDP,TCP,SSL,TLS,RELP; 直接将日志写入到数据库; 支…

    2026年3月8日
    7

发表回复

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

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