iOS刷新view方法小结

作者: 叶子扬 | 来源:发表于2017-04-13 17:17 被阅读727次

视图刷新是常有的事情,数据的更新、视图的创建、添加、滚动、frame的改变,都更刷新相关,掌握刷新的窍门,能提高应用的性能和用户体验。

layoutSubviews

以下几个动作都会触发layoutSubviews

  • 1、创建视图
    • 使用initWithFrame 进行初始化时会触发layoutSubviewsinit初始化不会触发
    • rect = CGRectZero时,initWithFrame也不会触发layoutSubviews
  • 2、添加视图: 使用addSubview方法
  • 3、修改视图frame:设置view的Frame,并且frame的值设置前后不一样,会触发父UIView上的layoutSubviews事件
  • 4、滚动视图:UIScrollView滚动的时候会调用更新视图
  • 5、旋转屏幕:会触发父UIView上的layoutSubviews事件

看看 Apple 给出的描述:
The default implementation of this method does nothing on iOS 5.1 and earlier. Otherwise, the default implementation uses any constraints you have set to determine the size and position of any subviews.
Subclasses can override this method as needed to perform more precise layout of their subviews.You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want. You can use your implementation to set the frame rectangles of your subviews directly.
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call thelayoutIfNeeded method.

翻译成白话文,就是要重写layoutSubviews这个方法,但是不要直接调用,而是用setNeedsLayout来触发它执行刷新方法,但是这个方法并不会立即刷新,而是在下一次运行循环的时候才执行。若要立即更新,补上layoutIfNeeded方法就OK啦

sizeToFit和 sizeThatFits:

sizeToFit刷新调用者,给调用者一个最合适的size,这个size会紧紧的围绕着这个视图,例如:label调用它,那么label的size将会是最合适的size:刚好容纳下所有文字(注:如果label设置了numberOfLines:,那么只会给出对应的行数的size而不是全部)
sizeThatFits:不会刷新调用者的frame,但是会返回最合适的size(最合适的意思同上)
具体用法见。。。

drawRect:和setNeedsDisplay

drawRect:提供绘制功能,如果要刷新绘画,不能直接调用,而是通过setNeedsDisplay来触发
setNeedsLayout:。他会标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用

setNeedsDisplayInRect:(CGRect)invalidRect:

  • 标记为需要局部重绘sizeToFit会自动调用sizeThatFits方法
  • sizeToFit不应该在子类中被重写,应该重写sizeThatFits,sizeThatFits传入的参数是receiver当前的size,返回一个适合的sizesizeToFit可以被手动直接调用sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己

layoutSubviewslayoutIfNeeded

  • 方法如其名,UIKit会判断该receiver是否需要layout.

根据Apple官方文档layoutIfNeeded方法应该是这样的:

  • layoutIfNeeded遍历的不是superview链,而是subviews链
  • drawRect是对receiver的重绘,能获得contextsetNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘
  • iphone device的刷新频率是60hz,也就是1/60秒后重绘

相关文章

  • iOS刷新view方法小结

    视图刷新是常有的事情,数据的更新、视图的创建、添加、滚动、frame的改变,都更刷新相关,掌握刷新的窍门,能提高应...

  • 悬浮窗如何刷新view数据,比如TextView的文本消息?

    WindowManager的updateViewLayout方法只会刷新view的位置等信息,不会刷新view的内...

  • uni-app 下拉刷新

    当页面使用了scroll-view后,原本的下拉刷新在ios端有问题,需要改成scroll-view提供的刷新能力...

  • iOS刷新view

    试了setNeedsLayout()、layoutIfNeeded()无果,只好尝试重新加载具体的UI布局方法 问...

  • setNeedsLayout setNeedsDisplay v

    对当前了解的知识点做下总结 iOS Layout机制相关方法 修改view的frame 告诉系统来刷新布局 告诉系...

  • iOS一个方法搞定view渐变色

    iOS一个方法搞定view渐变色 iOS一个方法搞定view渐变色

  • iOS刷新小结

    列表加载更多问题,多页(分页加载) -(void)LoadNewData{[self getDataWithHea...

  • View滑动的六种方法

    view滑动方法1:通过layout重新设置左上右下参数,刷新界面 view滑动方法2:offsetLeftAnd...

  • iOS view如何刷新

    iOS视图强制刷新 在iOS程序里,我们如果有一个view需要改变了他的数据,需要强制刷新,比如说,我们在我们的T...

  • iOS view如何刷新

    转自 csdniOS视图强制刷新 在iOS程序里,我们如果有一个view需要改变了他的数据,需要强制刷新,比如说,...

网友评论

    本文标题:iOS刷新view方法小结

    本文链接:https://www.haomeiwen.com/subject/wpnbattx.html