首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么时候调用layoutSubviews?

在iOS开发中,layoutSubviews是一个重要的方法,它在视图的布局发生变化时被调用。layoutSubviews方法会在以下情况下被调用:

  1. 当视图的bounds发生变化时。
  2. 当视图的frame发生变化时。
  3. 当视图的位置发生变化时。
  4. 当视图的transform发生变化时。
  5. 当视图的隐藏状态发生变化时。
  6. 当视图的层级关系发生变化时。
  7. 当视图的透明度发生变化时。

在这些情况下,系统会自动调用layoutSubviews方法,以便开发者可以在该方法中更新视图的布局。

在自定义视图中,开发者可以重写layoutSubviews方法,以便在视图的布局发生变化时执行自定义的布局代码。在重写layoutSubviews方法时,开发者应该遵循以下原则:

  1. 不要直接调用layoutSubviews方法,而是让系统自动调用它。
  2. 不要在layoutSubviews方法中进行耗时的操作,因为该方法会在主线程中执行,如果耗时太长,会导致界面卡顿。
  3. 不要在layoutSubviews方法中调用setNeedsLayoutsetNeedsDisplay方法,因为这会导致无限递归,导致应用程序崩溃。

总之,layoutSubviews是一个非常重要的方法,它可以帮助开发者在视图的布局发生变化时更新视图的布局,以便在屏幕上正确显示视图的内容。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

什么时候调用layoutSubviews

比如,我们想更新子视图的位置的时候,可以通过调用layoutSubviews方法,既可以实现对子视图重新布局。...layoutSubviews以下情况会被调用 苹果官方文档已经强调,不能直接调用layoutSubviews对子视图进行重新布局。那么,layoutSubviews什么情况下会被调用呢?...通过百度搜索,发现以下几种情况layoutSubviews会被调用。 直接调用setLayoutSubviews。(这个在上面苹果官方文档里有说明) addSubview的时候。...我简单测试了一下,上面基本都会被调用。 注意: 当view的fram的值为0的时候,`addSubview`也不会调用`layoutSubviews`的。...layoutSubviews方法在对自雷视图进行布局的时候非常方便。可以自己动手,深入理解layoutSubviews调用机制。

41610

layoutSubviews 调用

而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。...当UIView设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubviews方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。...何时调用的问题 layoutSubviews何时调用的问题,这个方法是当你需要在调整subview的大小的时候需要重写(我这个翻译不严谨,以下是原文:You should override this...,但有时候经常指望它被调用的时候没被调用,不希望它被调用的时候被调用了,搞的很上火。根据国外社区一个人帖子,做了总结性翻译。...layoutSubviews在以下情况下会被调用: 1、init初始化不会触发layoutSubviews 2、addSubview会触发layoutSubviews 3、设置view的Frame

54750
  • layoutSubviews 详解

    在以下情况下会被调用: 1、init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发 2、addSubview...layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。 反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。...刷新子对象布局 –layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写 -setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局...,不立即刷新,但layoutSubviews一定会被调用 -layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews...方法调用先于drawRect setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews layoutIfNeeded

    47030

    layoutSubviews总结

    在下面情况下会被调用: 1、init初始化不会触发layoutSubviews 可是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发 2、addSubview...layoutSubviews, 当我们在某个类的内部调整子视图位置时,须要调用。 反过来的意思就是说:假设你想要在外部设置subviews的位置,就不要重写。...刷新子对象布局 -layoutSubviews方法:这种方法,默认没有做不论什么事情,须要子类进行重写 -setNeedsLayout方法: 标记为须要又一次布局,异步调用layoutIfNeeded...刷新布局,不马上刷新,但layoutSubviews一定会被调用 -layoutIfNeeded方法:假设,有须要刷新的标记,马上调用layoutSubviews进行布局(假设没有标记,不会调用layoutSubviews...方法调用先于drawRect setNeedsLayout在receiver标上一个须要被又一次布局的标记,在系统runloop的下一个周期自己主动调用layoutSubviews layoutIfNeeded

    22820

    setNeedsLayout和layoutIfNeeded看我就懂!

    前言: 开发得跟view打交道,我们也经常看到苹果官方代码有layout方法的相关调用,但是大家可知道什么时候调用什么时候需要吗?...针对网上大部分资料讲得不够清晰,我决定用Demo来讲解 一、layoutSubviews 不能直接调用这个方法。...,在应用程序的主线程调用此方法。...** 刷新子对象布局: -layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写 -setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded...刷新布局,不立即刷新,但layoutSubviews一定会被调用 -layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews

    2.7K90

    UIViewController生命周期

    文件来创建UIViewController的view 如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性 默认不用实现 其他情况什么时候调用呢...; 10、ViewDidUnload(已废弃) 当内存过低,释放一些不需要的视图时调用。...三、UIView生命周期其他点 layoutSubviews的被调用的时机: addSubview会触发layoutSubviews,比如viewA add viewB,第一次添加A和B的layoutSubviews...都会被调用,而第二次(viewA已经有了viewB)只调用viewB的 view的Frame变化会触发layoutSubviews 滚动一个UIScrollView会触发layoutSubviews 旋转...Screen会触发父UIView上的layoutSubviews 改变transform属性时,当然frame也会变 处于key window的UIView才会调用(程序同一时间只有一个window为keyWindow

    1.9K10

    Python中面向对象初始化方法什么时候调用?怎么设置初始值?

    先将案例代码进行调整,观察一下执行结果:先调用方法再设置属性图片AttributeError: 'Cat' object has no attribute 'name':属性错误:Cat对象没有’name...----二、初始化方法2.1创建对象时自动调用调用初始化方法在使用类名()创建对象时,解释器会自动执行以下操作:1. 为对象在内存中分配空间-------》创建对象2....在Cat中增加__init__方法,验证该方法在创建对象时会被自动调用:class Cat: def __init__(self): print("这是一个初始化方法")# 使用类名...()创建对象的时候,会自动调用初始化方法 __init__black = Cat()执行结果:图片2.2 在初始化方法内部定义属性在__init__方法内部使用self.属性名 = 属性的初始值 就可以定义属性...在创建对象时,使用类名(属性1,属性2...)调用上面代码中,如果你在创建一个对象,并调用eat(),依旧是黑黑爱吃罐头,这样name属性就被固定死了,就不能很灵活的被运用,所以要进行改造。

    95220
    领券