博客> UIView自带的方法
UIView自带的方法
2017-08-15 16:06 评论:0 阅读:235 诸葛亮倒骑小毛驴
ios UIView自带的方法

UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。

综上两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘。

先大概看下ios layout机制相关的这几个方法:

  • (CGSize)sizeThatFits:(CGSize)size

  • (void)sizeToFit

——————-

  • (void)layoutSubviews

  • (void)layoutIfNeeded

  • (void)setNeedsLayout

——————–

  • (void)setNeedsDisplay

  • (void)drawRect

UIView自带的方法

  • (void)setNeedsLayout; (异步方法)
  • (void)layoutIfNeeded;(强制立即刷新)

一、

layoutSubviews在以下情况下会被调用:

1、init初始化不会触发layoutSubviews。

2、addSubview会触发layoutSubviews。

3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。

4、滚动一个UIScrollView会触发layoutSubviews。

5、旋转Screen会触发父UIView上的layoutSubviews事件。

6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。

7、直接调用setLayoutSubviews。

8、直接调用setNeedsLayout。

在苹果的官方文档中强调: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]

1 UIView自带的方法 2 1> - (void)layoutSubviews; 3 当一个控件的frame发生改变的时候就会自动调用 4 一般在这里布局内部的子控件(设置子控件的frame) 5 一定要调用super的layoutSubviews方法 6 7 2> - (void)didMoveToSuperview; 8 当一个控件被添加到父控件中就会调用 9 10 3> - (void)willMoveToSuperview:(UIView )newSuperview; 11 当一个控件即将被添加到父控件中会调用

收藏
1
sina weixin mail 回到顶部