2014-12-01 63 views
0

我一直在寻找this thread,因为我试图实现同样的事情。但是,我发现Canvas类是作为UIImageView的子类实现的。我试图做同样的事情,除了在UIView。如何使用UIView而不是UIImageView影响此解决方案的实施?我看到self.image使用了几次,但我不知道如何改变,因为我不认为这在通用UIView中可用。Swift:在UIView中绘制基于触摸的UIBezierPath

回答

0

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

既然你只是想添加一个UIBezierPath,我只需要创建一个CAShapeLayer,放入你的bezier路径,并将它放在你的视图背景层(self.view.layer)之上。 DrawRect不需要做任何事情。

0

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

注意,有一些优点,以使快照的方法(保存为UIImage)对象,你在UIImageView或手动两种显示绘制你的UIView子类的drawRect。随着您的绘图变得越来越复杂,如果您的drawRect必须重新绘制所有路径段(因为与单个屏幕手势相关联的触摸很多,所以它可能会惊人地快速变为数千个位置),您将开始遇到性能问题。一触即发。恕我直言,我认为你引用的其他答案太过分了,每创建一个新快照touchesMoved。当您查看Retina iPad或iPhone 6 plus的全分辨率图像时,这是在每次触摸事件时创建的大图像快照。我个人采用混合方式:我的drawRectCAShapeLayer将呈现与当前手势相关联的当前路径(或touchesBegantouchesEnded之间的touchesMoved事件的集合),但是当手势完成时,它将创建新的快照。

+0

如果我使用UIImage并制作快照,我可以编辑已绘制的形状吗?这听起来对我来说,如果他们是在一个图像中,他们不会被编辑,我只能在他们之上画更多的东西,而不会删除我已经绘制的任何东西。这是我想要做的一个关键功能,所以如果这是不可能的,我必须用UIView来完成。 – NumberOneRobot 2014-12-01 20:10:22

+0

显然,快照将不可编辑(当然,超出像素编辑)。但是,如果保留用于生成该快照的模型对象(例如路径),则可以编辑模型,然后在理论上随时重新生成快照。因此,我建议快照不是模型(正如其他问题的接受答案似乎暗示的那样),而只是一种渲染优化,可以避免每次更新模型时重新绘制所有旧路径。 – Rob 2014-12-01 20:36:42

+0

因此,保存一张图片,也许每次我创建一个新的贝塞尔路径,然后每次添加一条新路径时,我都会从图像和路径创建一个新图像?那么,而不是必须重新渲染具有巨大潜在点数的贝塞尔路径,而是只需渲染图像,它只是指定的像素? – NumberOneRobot 2014-12-01 20:48:10