问题描述
我有一个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
函数中使用setLineCap
和draw
。这意味着每当抽奖发生时,他们就会一次又一次地被设置。
我想知道,有没有办法让我在每次启动时设置一次绘图属性,而不是一遍又一遍地设置?
解决方法
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
的调用并不是特别频繁(实际上,在应用程序的生命周期中仅被告知只绘制一次视图的情况并不少见)。
因此,请遵守规则:当您被告知要绘制时,进行完整的绘制。