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

使用drawRect绘制到我自己的UIView

drawRect: 是 iOS 开发中的一个方法,用于在自定义的 UIView 上绘制图形。以下是关于 drawRect: 的基础概念、优势、类型、应用场景以及可能遇到的问题和解决方法。

基础概念

drawRect:UIView 类的一个方法,当视图需要重绘其内容时,系统会调用这个方法。开发者可以在这个方法中使用 Core Graphics 框架来绘制自定义的图形。

优势

  1. 灵活性:可以完全自定义视图的绘制逻辑。
  2. 性能:通过合理使用缓存和避免不必要的重绘,可以提高性能。
  3. 直观性:直接在视图上绘制,便于理解和调试。

类型

  • 基本图形绘制:如矩形、圆形、线条等。
  • 图像处理:如绘制图片、图像滤镜等。
  • 文本渲染:如自定义字体、颜色、对齐方式等。

应用场景

  • 自定义控件:如自定义按钮、滑块等。
  • 图表绘制:如折线图、柱状图等。
  • 游戏界面:如绘制游戏中的角色、场景等。

示例代码

以下是一个简单的示例,展示如何在 UIView 中使用 drawRect: 绘制一个红色矩形:

代码语言:txt
复制
import UIKit

class CustomView: UIView {
    
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        
        // 获取当前上下文
        guard let context = UIGraphicsGetCurrentContext() else { return }
        
        // 设置填充颜色
        context.setFillColor(UIColor.red.cgColor)
        
        // 绘制矩形
        context.fill(CGRect(x: 0, y: 0, width: rect.width, height: rect.height))
    }
}

可能遇到的问题及解决方法

1. 视图不更新

原因:视图的重绘没有正确触发。 解决方法

  • 调用 setNeedsDisplay()setNeedsDisplay(_:) 来标记视图需要重绘。
代码语言:txt
复制
customView.setNeedsDisplay()

2. 绘制内容模糊

原因:绘制时没有考虑屏幕的像素密度(如 Retina 屏幕)。 解决方法

  • 使用 UIScreen.main.scale 来获取当前屏幕的缩放因子,并在绘制时进行相应的缩放。
代码语言:txt
复制
let scale = UIScreen.main.scale
context.scaleBy(x: scale, y: scale)

3. 性能问题

原因:频繁重绘或不必要的复杂绘制操作。 解决方法

  • 使用 shouldRasterize 属性来缓存复杂的绘制结果。
代码语言:txt
复制
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale

通过以上信息,你应该能够理解 drawRect: 的基本用法、优势、应用场景以及常见问题的解决方法。如果还有其他具体问题,欢迎继续提问!

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

相关·内容

UI篇-VC的生命周期以及UIView的layoutSubviews和drawRect方法

前言 看似常用的UIView,其实有很多不经常用到的方法和应该注意的机制,我是一个喜欢打破砂锅问到底的人,可是很多问题在网上搜索不到答案,大部分的博客都是转载相同的东西,所以我自己就新建 Dome,实际测试了一些数据...: ** 在使用 VC绘制UI的时候,它不同于 UIView,UIView中 init方法调用后,UIView就已经绘制好(初始化好了)。...UIView中方法的执行顺序大概是这样的: init 方法 >>属性的set/get 方法>> layoutSubviews(当然是要达到触发条件)>>drawRect, 使用得当可以在View的调用中起到很好的效果...以上1,2推荐;而3,4不提倡 drawRect方法使用注意点: 1、 **若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。...** 2、**若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制**,或者在delegate中的相应方法绘制。

1.9K30

IOS开发系列——UIView专题之三:自定义绘制篇【整理,部分原创】

3UIView重绘机制 3.1DrawRect机制 3.1.1简介 iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView...(调用setNeedsDisplay会自动调用drawRect) 在UIView中,重写drawRect: (CGRect) aRect方法,可以自己定义想要画的图案.且此方法一般情况下只会画一次.也就是说这个...以上1,2推荐;而3,4不提倡 1、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。...2、若使用calayer绘图,只能在drawInContext:中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。...tid=7085 主题: drawRect中,如何清除之前所绘制的内容 http://www.cocoachina.com/bbs/read.php?

1.2K30
  • 谈谈对drawRect的理解

    写在前面 UIView对于iOS开发来讲,再熟悉不过了。也正是因为这一点,我们可能会忽略UIView一些特有方法的理解和使用。今天,笔者主要整理一下对drawRect方法的理解和使用。...当子类使用Core Graphics和UIKit绘制视图内容时就需要在该方法中添加绘制的代码。 drawRect简介 drawRect方法在UIView的使用上起着十分关键的作用。...该方法定义在UIView(UIViewRendering)分类里面,望文生义,该方法完成视图的绘制。...若使用UIView绘图,只能在drawRect:方法中获取绘制视图的contextRef。...; 若使用CALayer绘图,只能在drawInContext :绘制,或者在delegate方法中进行绘制,然后调用setNeedDisplay方法实现最终的绘制; 若要实时画图,不能使用gestureRecognizer

    1.8K20

    iOS动画-CALayer基础知识

    时,其内部会自动创建CALayer图层对象(即UIView的关联图层),UIView调用drawRect:方法进行绘图,并且将所有的内容绘制到自己的图层上,绘制完毕后,系统会将图层拷贝到屏幕上,于是就完成了...给contents赋值CGImage的值并不是唯一设置寄宿图的方法,我们也可以直接使用Core Graphics直接绘制寄宿图,即通过继承UIView并实现-drawRect:的方式。...-drawRect:方法是UIView没有默认实现的方法,因为寄宿图并不是必须的;但如果UIView检测到此方法被实现了,此方法会被自动调用,然后我们就可以在其中使用Core Graphics绘制自己需要的内容了...自定义绘制寄宿图1.png 特别注意1:如果没有自定义绘制任务不需要寄宿图,就不要在子类中写一个空的-drawRect:方法,否则会造成CPU资源和内存的浪费; 特别注意2:如果我们将绘制过程的角度参数改为动态...主动绘制 我们需要显式的调用-display方法;这不同于UIView,当图层显示到屏幕上时,CALayer不会自动重绘它的内容,CALayer把重绘的决定权交给了开发者; 2.绘制特点 尽管没有使用

    1.9K50

    setNeedsDisplay看我就懂!

    前言: setNeedsDisplay异步执行的。它会自动调用drawRect方法,这样可以拿到 UIGraphicsGetCurrentContext,就可以绘制了。...一、着手 我定义了一个UIView的子类,用于演示使用setNeedsDisplay,这个CircleView子类会在draw(_ rect: CGRect)方法内简单绘制一个圆,它有一个颜色属性,这是我们将要设置用来改变圆的颜色...一般来说,使用框架控件,当您设置属性(如显示标签或值)时,您将会使用该属性,这样会导致重新绘制控件,因为系统会实现对控件drawRect方法的调用。...而我们自定义了自己的UIView子类,所以我们需要处理影响显示的控件的更新。在改变颜色的情况下,当然需要我们自己控制重新绘制。...drawRect的UIView子类时,需要在需要重绘时指示给系统。

    1.3K60

    iOS layout相关方法

    layoutSubviews 5.旋转Screen会触发父UIView上的layoutSubviews事件 6.改变UIView大小的时候也会触发父UIView上的layoutSubviews事件 在苹果的官方文档中强调...drawRect在以下情况下会被调用: 1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。...以上1,2推荐;而3,4不提倡 drawRect方法使用注意点: 1、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。...2、若使用calayer绘图,只能在drawInContext: 中(类似于drawRect)绘制,或者在delegate中的相应方法绘制。...receiver当前的size,返回一个适合的size sizeToFit可以被手动直接调用 sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己 假设 let

    1.1K10

    IOS渲染流程之提交图层数据至RenderThread进程

    代表Bitamp,渲染流程后的Bitmap被存储在content属性中(这个bitmpa也叫back store)UIView代表视图树对应的CALayer对应图层树 分离UIView和CALayer的目的在于...对应于不同的交互UIView(负责响应用户交互,管理视图用于显示正确的图层树)是不同的,而CALayer(图层树)只负责提供Bitmap用于CoreAnimation框架读取组合,CoreAnimation...渲染流程基于顶点,基于纹理(直接提供图片): 1.使用图片纹理:contents属性配置 数据类型为id而不是CGImage是为了适配MAC OS系统,MAC OS系统中定义CFImage和NSImage...都起作用 2.自己基于顶点来处理数据,手动绘制 顶点的需要自己计算纹理,光照信息用于片段主色器显示颜色 UIView中有一个drawRect方法用于实现自定义绘制,由Core Graphics处理绘制寄宿图..., 实现原理:drawRect是CALayer的方法,CALayer中有一个delegete代理的属性,UIView实现了这个代理的协议,因此CALayer请求代理(UIView)得到数据,代理可以设置

    49710

    图形

    1、UIView+drawRect+UIBezierPath 重写drawRect能够自动生成Context,所以可以在drawRect方法里面画图形 - (void)drawRect:(CGRect...CoreGraphics绘制图形A,想要使用UIKit绘制完全不同的图形B,此时就希望保存当前绘图context及已绘制内容。...使用场景是: 当前正在绘制图形A。 使用UIGraphicsBeginImageContext将旧的绘图context入栈,创建新的绘图context并使用。 绘制图形B。...视图即UIView,并不是直接显示在屏幕上,而是在创建视图对象的时候视图对象会自动创建一个层,而视图对象把要显示的东西绘制在层上,待到需要显示时硬件将所有的层拷贝,然后按Z轴的高低合成最终的显示结果...:,并传入刚才准备好的上下文 view的drawLayer:inContext:方法内部又会调用view的drawRect:方法 view就可以在drawRect:方法中实现绘图代码, 所有东西最终都绘制到

    1.1K10

    绘图-几个较复杂统计图案例的实现分析

    小圆点的动画 根据数据源,在每一数据点处放上一个自定义UIView,在此自定义UIView的drawRect中绘制圆形图形,并且设置 shape.layer.opacity = 0;,即让这些小圆点(...在使用drawRect:重绘页面时注意首先移除已有的图层maskLayer 同时做动画。...曲线图弹性动画.gif 整个效果的实现过程是这样的: 触发UIView的 drawRect 方法; [_lineGraph setNeedsDisplay]; **使用 setNeedsDisplay...绘制关键步骤: 使用for循环在 drawRect方法中绘制每一个扇形(上篇文章已将讲过),因为环外的标注,所以圆环需要小些,否则外环线上的文字绘制起来有可能空间不够。...,还有一个十字线,这个只要会画线段就会画十字线,这个也不多说了; 这些掌握了之后就可以绘制专属自己的K线图了,其他的都是一些细节小问题,CGContextRef还有很多用法,有兴趣的自己可以找度娘,接下来附上我的最终的绘制结果

    1.5K20

    【IOS开发基础系列】UIView专题

    重写这个方法可以用来选择忽略一些他们不关心的对象 drawRect:     在接收者视图中绘制矩形 - (void)drawRect:(CGRect)rect 参数 rect     一个定义的需要绘制的矩形...使用UIGraphicsGetCurrentContext方法去获取当前图形内容用来绘制,坐标原点在左上角。不要保留图片内容当他可以被drawRect:这个方法调用。...(调用setNeedsDisplay会自动调用drawRect)         在UIView中,重写drawRect: (CGRect)aRect方法,可以自己定义想要画的图案.且此方法一般情况下只会画一次...2、若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。...pointInside:withEvent:方法,如果pointInside返回YES,则表明触摸事件发生在我自己内部,则会遍历自己的所有Subview去寻找最小单位(没有任何子view)的UIView

    70530

    iOS学习——Quartz2D学习(1)

    他是一个二维的绘图引擎,同时支持iOS和Mac系统 2、Quartz2D能完成的工作   画基本线条,绘制文字,图片,截图,自定义UIView. 3、Quartz2D在开发中的价值   当我们的控件样式极其复杂时...相关联.才能将内容绘制到View上面.在DrawRect方法方法里 步骤: 1.要先自定定UIView 2.实现DrawRect方法 3.在DrawRect方法中取得跟View相关联的上下文...DrawRect是系统自己调用的, 它是当View显示的时候自动调用. 8、画线(基本步骤描述)  //1.获取跟View相关联的上下文 CGContextRef ctx = UIGraphicsGetCurrentContext...在调用这些方法之前,我们要进行一些其他的任务去确保正确的绘制path,以及path的设置。 使用UIColor类的方法去stroke和fill想要的颜色。...使用stroke和fill方法进行渲染时,不需要我们手动去获取上下文了,这两个方法会自定获取view的上下文,然后在该view上绘制渲染path对应的路径,stroke是绘制线,fill是填充path对应的封闭区域

    1.1K20

    iOS CPU异步绘制的流程

    为了减轻GPU的负担,我们有时也需要依靠CPU来进行协助绘制,这篇文章主要讲解CPU进行异步绘制的流程,部分内容摘录自iOS探索:UI视图之卡顿、掉帧及绘制原理 UIView的绘制原理(CPU绘制)...UIView绘制流程以及异步绘制.png 当我们调用[UIView setNeedsDisplay]这个方法时,其实并没有立即进行绘制工作,系统会立刻调用CALayer的同名方法,并且会在当前layer...drawLayer:inContext方法,如果有实现,就会创建一个空的寄宿图和Core Craphics的绘制上下文,为绘制寄宿图做准备,然后会在一个合适的时候调用一个我们非常熟悉的方法[UIView...drawRect:]来获取寄宿图内容。...[UIView drawRect:]这个方法默认是什么都不做,系统给我们开这个口子是为了让我们可以再做一些其他的绘制工作 无论是哪个分支,最终都会由CALayer上传对应的backing store

    74450

    iOS 之 异步绘制原理

    异步绘制产生背景 ---- UIView 中有一个 CALayer 的属性,负责 UIView 具体内容的显示。...解决方案使用异步绘制就是: 把 UIView 显示的内容(包括 UILabel 的文字,UIImageView 的图片等)绘制生成的 bitmap 在子线程完成。...在 UIView 中 layer.delegate 就是 UIView 本身,UIView 并没有实现 displayLayer: 方法,所以进入系统的绘制流程,我们可以通过实现 displayLayer...然后在合适的时机回调代理,调用 drawRect 默认操作是什么都不做(而之所以有这个接口,就是为了让我们在系统绘制之后,还可以做些自定义的绘制工作)。...面试考点 ---- ▐ 我们调用 [UIView setNeedsDisplay] 方法的时候,不会立马发送对应视图的绘制工作,为什么?

    3.3K30

    绘图-Core Graphics

    iOS有分多种图形上下文,其中UIView自带提供的在drawRect:方法中通过UIGraphicsGetCurrentContext获取,还有专门为图片处理的context,UIGraphicsBeginImageContext...简述 绘图的步骤:(在drawRect函数中) 1.获取绘图上下文 2.创建并设置路径 3.将路径添加到上下文 4.设置上下文状态 5.绘制路径 6.释放路径 在使用Core Graphics...当你子类化了一个UIView并实现了自己的drawRect:方法后,一旦drawRect:方法被调用,Cocoa就会为你创建一个图形上下文,此时你对图形上下文的所有绘图操作都会显示在UIView上。...或CGContextRef配合使用后才可以展示出图形,它只是负责绘制路径path的. ---- 推荐好文章: 打造自己的“美图秀秀” 关于Core Image 看这里 ---- ?...效果.gif 本文考虑到简洁就不上代码了,具体的代码实现的效果可以到我GitHub去下载查看,喜欢的话,请star 一下。

    1.6K30

    UIView和CALayer

    CALayer作为一个低级的,可以承载绘制内容的底层对象出现在该框架中。 CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。...作用机制 当UIView需要显示的时候,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上(CALayer上),系统将图层拷贝到屏幕上,完成UIView的显示。...UIView侧重于对显示内容的管理,CALayer侧重于对内容的绘制。 UIView和CALayer是相互依赖的关系。...UIView依赖与CALayer提供的内容,CALayer依赖UIView提供的容器来显示绘制的内容。...归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。

    98610

    iOS技术面试题及答案

    微信截图_20200911135347.png 一、如何绘制UIView? 绘制一个UIView最灵活的方法就是由它自己完成绘制。...实际上你不是绘制一个UIView,而是子类化一个UIView并赋予绘制自己的能力。当一个UIView需要执行绘制操作时,drawRect:方法就会被调用,覆盖此方法让你获得绘图操作的机会。...当drawRect:方法被调用,当前图形的上下文也被设置为属于视图的图形上下文,你可以使用Core Graphic或者UIKit提供的方法将图形画在该上下文中。...好处: 1.使用多线程可以把程序中占据时间长的任务放到后台去处理,如图片,视频的下载; 2.发挥多核处理器的优势,并发执行让系统运行的更快,更流畅,用户体验更好; 缺点: 1.大量的线程降低代码的可读性...十、生成二维码的步骤 1.使用CIFilter滤镜类生成二维码 2.对生成的二维码进行加工,使其更清晰 3.自定义二维码背景色、填充色 4.自定义定位角标 5.在二维码中心插入小图片 总结 以上就是这篇文章的全部内容了

    86601
    领券