iOS drawRect、initWithFrame、init、setFrame、layoutSubViews调用时机问题

前言
最近在研究关于Quart2D方面的知识,通过在drawRect方法内可以对一个视图进行绘制并呈现出我们所想要的图形,在drawRect方法内一般都是通过rect的传参来确定我们的绘制区域,但在现在的开发过程中,基于fram来确定视图的位置的方式已经很少使用,大都使用mansory和AutoLayout来确定视图的fram,所以在自定一个view的时候需要拿到视图的准确的fram来进行绘制,当然这也就涉及到了真实的fram到底在哪里可以准确的拿到的问题

好了,进入正题

  • 方式1 通过initwithFrame方式创建视图


    iOS drawRect、initWithFrame、init、setFrame、layoutSubViews调用时机问题_第1张图片
    111.png
iOS drawRect、initWithFrame、init、setFrame、layoutSubViews调用时机问题_第2张图片
222.png

通过initWithFrame方式创建的视图的调用方式是
1 : setFrame
2:initWithFrame
3:layoutSubviews
4:drawRect

  • 方式2 通过alloc init方式创建视图
iOS drawRect、initWithFrame、init、setFrame、layoutSubViews调用时机问题_第3张图片
465.png
iOS drawRect、initWithFrame、init、setFrame、layoutSubViews调用时机问题_第4张图片
3333.png

通过alloc init方式创建的调用方式是
1 setFrame
2 init
3 应为我在外面设置了fram所以这里再次调用setFrame
4 layoutSubviews
5 drawRect

结语
如果使用了AutoLayout或者mansory等 ,主动调用updateConstraintsIfNeeded 获取的frame是不真实的,如果需要得到自定义的view的frame可以在layoutSubViews里面获取到,如果需要得到UIController内的view的frame 可以在viewDidLayoutSubviews方法中遍历self.View的subViews获取到view的真实frame,作者这里是想在drawRect方法中绘制视图,所以将一个UIView的创建和调用API的顺序理了一下。

你可能感兴趣的:(iOS drawRect、initWithFrame、init、setFrame、layoutSubViews调用时机问题)