Swift:在UIView中基于触摸绘制UIBezierPath

时间:2014-12-01 18:14:24

标签: ios iphone swift uiview uiimageview

我一直在关注this thread,因为我正在努力实现同样的事情。但是,我看到Canvas类是作为UIImageView的子类实现的。我试图做同样的事情,除了在UIView。如何使用UIView而不是UIImageView影响此解决方案的实现?我看到self.image使用了几次,但我不知道我是如何改变的,因为我认为它不适用于通用的UIView。

2 个答案:

答案 0 :(得分:0)

在该问题的答案中,首先将self.image绘制到绘图上下文中,然后将绘图应用于顶部,最后将图像更新为旧图像,并在顶部绘制新内容。

由于您只想添加UIBezierPath,我只需创建一个CAShapeLayer,您可以在其中放置贝塞尔曲线路径,并将其放置在视图背景层(self.view.layer)之上。没有必要对DrawRect做任何事情。

答案 1 :(得分:0)

是的,您可以将其实现为UIView子类。您的模型应该保存触摸事件的位置(或从这些位置构建的路径),然后视图的drawRect可以呈现这些路径。或者,您也可以创建与这些路径关联的CAShapeLayer个对象。两种方法都运行良好。

请注意,制作快照(保存为UIImage)对象的方法有一些优点,您可以在UIImageView中显示或手动绘制drawRect UIView子类。随着您的绘图变得越来越复杂,如果您的drawRect必须重绘所有路径段(它可以快速地成为数千个位置,因为有很多触点与a相关),您将开始遇到性能问题每次触摸时单屏幕手势。

恕我直言,我认为你引用的其他答案太过分了,每个touchesMoved制作一个新的快照。当您查看视网膜iPad或iPhone 6 plus的全分辨率图像时,这是在每次触摸事件时创建的大型图像快照。我个人采用混合方法:我的drawRectCAShapeLayer将呈现与当前手势相关联的当前路径(或touchesMoved与{{1之间的touchesBegan事件的集合但是,当手势完成时,它将创建一个新的快照。