是否只需设置一次UI图形上下文绘图属性,而不是每次都设置绘图属性?

问题描述

我有一个Canvas UIView,如下所示。 (紧跟https://youtu.be/E2NTCmEsdSE之后)

class Canvas: UIView {
    
    override func draw(_ rect: CGRect){
        super.draw(rect)
        
        guard let context = UIGraphicsGetCurrentContext() else { return }
        
        // Other codes
        
        context.setLineWidth(10)
        context.setLineCap(.round)
        context.strokePath()
    }
    
    // Other codes
}

好像我只能在setLineWidth函数中使用setLineCapdraw。这意味着每当抽奖发生时,他们就会一次又一次地被设置。

我想知道,有没有办法让我在每次启动时设置一次绘图属性,而不是一遍又一遍地设置?

解决方法

AFAIK UIKit使用上下文来绘制几乎所有内容,全局更改属性会产生巨大影响。

您可以做的是扩展CGContext来设置所需的属性或使用所需的属性执行笔划。

extension CGContext {
  func applyAppStyle() {
    context.setLineWidth(10)
    context.setLineCap(.round)
  }

  func strokeWithAppStyle() {
    context.setLineWidth(10)
    context.setLineCap(.round)
    context.strokePath()
  }
}
,

如前所述,如果您不希望将多行代码移入draw方法内的页面,则可以将这些行移至实用程序功能。

另一种可能性是,预先在代码中构造UIImage(通过绘制到上下文中),然后将 that 绘制到视图上下文中。 draw方法。但是,令人惊讶的是,这效率比您执行的操作要低 ,因为这意味着存储所有像素,然后在绘制时将它们全部复制到上下文中。

要理解的重要一点是,您的代码正确无误。你在做什么就是你在做什么。您的代码不是效率低下也不慢。看起来似乎很冗长,但这就是事实。绘图命令经过高度优化;毕竟,绘画是应用程序显示的本质。

请记住,上下文不一定会持久存在,并且对draw的调用并不是特别频繁(实际上,在应用程序的生命周期中仅被告知只绘制一次视图的情况并不少见)。

因此,请遵守规则:当您被告知要绘制时,进行完整的绘制。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...