iOS layoutSubviews调用时机


theme: awesome-green

layoutSubview的作用

layoutSubviews情况分析

  • init初始化不会触发layoutSubviews。
  • addSubview会触发layoutSubviews。

    如果addSubview 如果连续2个 只会执行一次,因为一次的runLoop结束后,如果有需要刷新,执行一次即可。

  • 改变一个UIView的Frame会触发layoutSubviews

    当然前提是frame的值设置前后发生了变化。

  • 滚动一个UIScrollView引发UIView的重新布局会触发layoutSubviews。
  • 直接调用setNeedsLayout 或者 layoutIfNeeded。

在苹果的官方文档中说明

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

翻译:layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。

iOS layout机制相关方法

  1. - (CGSize)sizeThatFits:(CGSize)size
  2. - (void)sizeToFit
  3. ——————-
  4. - (void)layoutSubviews
  5. - (void)layoutIfNeeded
  6. - (void)setNeedsLayout
  7. ——————–
  8. - (void)setNeedsDisplay
  9. - (void)drawRect

刷新子对象布局

  • layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写

  • setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用

  • layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]


文章标签:

原文连接:https://juejin.cn/post/6984250995874365448

相关推荐

Taro框架完美使用Axios

看完这篇,你也可以搞定有趣的动态曲线绘制

Codable保姆级攻略

iOS CarPlay|使用 CarPlay 为你的 App 提速

零基础教你Unity集成IOS原生本地推送

StoreKit2 实际接入时候的踩坑与解决实录

iOS:runloop 运行循环

第四届青训营阅读打卡活动来啦,奖品、规则全面升级,快来学习吧

支持SwiftUI!Swift版图片&视频浏览器-JFHeroBrowser上线啦

用 JavaScript 复原何同学B站头图、对前端构建工具的一些理解、弹幕的常规设计与实现 丨酱酱的下午茶第31期

现今 Swift 包中的二进制目标

[Android开发学iOS系列] 语言篇: Swift vs Kotlin

LeetCode - #125 验证回文串

通过Vue自定义指令实现前端埋点,我不写单元测试,被批了,利用噪声构建美妙的 CS,Kotlin协程-CoroutineScope丨酱酱的下午茶第30期

iOS 数据存储

iOS怎么用代码实现这样奇怪的动画

利用 UIScrollView 实现六棱柱图片浏览效果

iOS中为什么会有这么多锁呢?

免费ios开发流程和步骤教程

[LD]iOS二进制组件化与Protocol的潜在风险