`

UIView的layoutSubviews和drawRect方法何时调用

阅读更多

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

 

 

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。
 
drawRect在以下情况下会被调用:

 

1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect 掉用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在 控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量 值).
2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
以上1,2推荐;而3,4不提倡
 
drawRect方法使用注意点:

 

1、 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate 的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或 者 setNeedsDisplayInRect,让系统自动调该方法。
2、若使用calayer绘图,只能在drawInContext: 中(类似于drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来调用setNeedsDisplay实时刷新屏幕
分享到:
评论

相关推荐

    iOS布局渲染之UIView方法的调用时机详解

    在iOS应用开发中,UI设计和布局是至关重要的部分,而理解UIView的渲染流程和方法调用时机则是优化用户体验的关键。本文将深入探讨iOS布局渲染中的UIView方法调用时机,帮助开发者更好地掌握视图的创建、布局更新和...

    uiview源码使用

    `layoutSubviews`方法在视图需要更新布局时被调用,开发者可以在其中调整子视图的位置和大小。 7. **遮罩和背景**:`UIView`的`backgroundColor`属性可以设置背景颜色,`maskLayer`属性则可以添加遮罩层,实现不...

    DSCollectionView

    索引条部分使用UIView 的 layoutSubviews绘制字母和边框线 setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就...

    UITableViewCell的绘画

    当一个单元格被创建或者重用时,系统会调用`UITableViewCell`的`- (void)layoutSubviews`方法来布局子视图。在这个方法中,开发者可以添加、删除或调整子视图的位置。接着,`- (void)drawRect:(CGRect)rect`方法会被...

    ios-彩色渐变旋转圆盘.zip

    在GYCircleView中,我们可以重写`layoutSubviews`方法来设置初始角度,然后使用`UIView.animate(withDuration:animations:)`方法来执行旋转动画。这个方法接收一个时间间隔和一个闭包,闭包中修改视图的transform...

    iOS折线渐变填充绘制动效

    - `layoutSubviews()`方法:可能在这里调用`animateShapeChange()`,确保每次视图布局变化时动画都能正确执行。 5. **注意事项**:在实际开发中,考虑到性能和内存管理,我们需要在适当的地方释放资源(如`...

    iOS如何为导航栏添加播放动画

    在iOS开发中,导航栏(NavigationBar)是用户界面的重要组成部分,通常...通过`FLAudioVisualizerView`类提供的属性和方法,开发者可以轻松地定制音频可视化效果,并将其整合到导航栏中,以提供更具吸引力的用户体验。

    IOS应用源码之AUISelectiveBordersView for iOS.rar

    源码中可能包含了`layoutSubviews`方法,该方法会在视图大小或子视图位置改变时被调用,用于更新视图的布局。 4. **绘图(Drawing)**:在iOS中,自定义视图的绘图通常在`drawRect:`方法中完成。...

    JBInterfaceController:向 WatchKit 界面控制器添加类似 UIViewController 的功能

    子类通过调用 updateInterface 方法(在 UIView drawRect 和 layoutSubviews 概念之后轻轻建模)使更新界面元素变得容易。 我的表行(我没有包括在这个例子中)是 JBInterface 子类,它们只是使自己无效。 然后...

    简单颜色选择器

    `.h`文件是头文件,通常包含了类的声明,包括接口定义、属性(properties)和方法(methods)。在这个情况下,`ColorPickerView`可能是自定义的一个UIView子类,用于展示颜色选择界面。头文件中可能会声明以下内容:...

    ios-导航栏滑动渐变MTransparentNav.zip

    同时,可以覆盖`layoutSubviews`方法,调整子视图的位置和大小,以适应渐变效果。 总结起来,实现滑动渐变的导航栏涉及多个iOS UI编程的核心概念,包括自定义导航栏、KVO、CADisplayLink、动画以及ScrollView的委托...

    IOS面试题2018总结188题

    - **自定义 UIView**:通常涉及重写 `drawRect:` 方法来绘制视图的图形内容。 - **自定义 UIControl**:除了绘图之外,还需要处理用户交互事件,例如触摸事件。 #### 8. 导入与包含 - **导入**:`import` 关键字...

    ios-自定义时分秒背景色的倒计时.zip

    在倒计时控件中,我们通常会创建一个UIView的子类,并在`drawRect:`方法或`layoutSubviews`方法中设置背景颜色。通过传递RGB值或预设的颜色名称,可以轻松更改背景颜色以适应应用的主题。 接着是字体大小的定制。在...

    ios-QQHeader.zip

    绘图过程通常在`drawRect:`方法中完成,该方法会在视图需要更新时被自动调用。 接下来是自定义视图的使用。在iOS中,为了实现独特的视觉效果,开发者经常需要创建自定义的UIView子类。在这个项目中,可能有一个名为...

    ios-余额的动态显示.zip

    2. 实现`layoutSubviews`方法,根据余额计算文字的frame。 3. 在接收到新余额数据时,更新自定义UILabel的余额属性,并调用`setNeedsDisplay`触发重绘。 4. 在`drawRect`方法中,根据动画状态绘制不同的数字。 5. ...

    100家企业iOS招聘需求整理

    - **layoutSubviews**:当视图的大小或位置变化时被调用,用于更新子视图布局。 - **drawRect:**:用于自定义视图的绘制逻辑。 ### 14. 设备唯一标识符 - **UDID**:已弃用的设备唯一标识符。 - **UUID**:当前推荐...

    iOS实现带指引线的饼状图效果(不会重叠)

    在 `layoutSubviews` 方法中,我们设置了视图和子视图的圆角半径及布局,确保它们居中并对齐。 3. 绘制饼状图和指引线: 接着,我们需要创建一个继承自 `UIView` 的类 `DVPieChart` 来实现饼状图的绘制。这个类需要...

    UILabel 上,中,下划线(iPhone源代码)

    `drawRect:`是`UIView`的一个方法,它会在视图需要更新时被调用,允许我们进行自定义绘图。 1. **上划线**:上划线可以通过在文本上方绘制一条线来实现。这通常涉及到计算文本的位置和高度,然后在适当的位置绘制...

Global site tag (gtag.js) - Google Analytics