【问题标题】:Swift: Drawing a UIBezierPath based on touch in a UIViewSwift:在 UIView 中基于触摸绘制 UIBezierPath
【发布时间】:2015-01-29 19:47:33
【问题描述】:

我一直在查看this thread,因为我正在尝试实现同样的事情。但是,我看到 Canvas 类是作为 UIImageView 的子类实现的。除了在 UIView 中,我正在尝试做同样的事情。使用 UIView 而不是 UIImageView 将如何影响此解决方案的实施?我看到self.image 使用了几次,但我不知道如何更改它,因为我认为通用 UIView 中没有。

【问题讨论】:

    标签: ios iphone swift uiview uiimageview


    【解决方案1】:

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

    由于您只想添加 UIBezierPath,我只需创建一个 CAShapeLayer,您可以在其中放置贝塞尔路径,并将其放置在视图支持层 (self.view.layer) 的顶部。不需要对 DrawRect 做任何事情。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 如果我使用 UIImage 并制作快照,我可以编辑已经绘制的形状吗?在我看来,如果它们在图像中,它们将不可编辑,我只能在它们之上绘制更多东西,而不会删除我已经绘制的任何东西。这是我想做的一个关键功能,所以如果这不可能,我将不得不使用 UIView。
      • 显然,快照不可编辑(当然,除了像素编辑)。但是,如果您保留在生成该快照时使用的模型对象(例如路径),您可以编辑您的模型,然后理论上在任何时候重新生成快照。因此,我建议快照不是模型(正如对其他问题的公认答案似乎暗示的那样),而仅仅是一种渲染优化,可以避免每次更新模型时重绘所有旧路径.
      • 所以保存图像,也许,每次我创建一个新的贝塞尔路径,然后每次我添加一个新路径时,我都会从图像和路径中创建一个新图像?因此,我不必重新渲染具有大量潜在点的贝塞尔路径,而只需渲染图像,这只是指定的像素?
      • 好的,我会看看我能弄清楚的,谢谢你的帮助!
      • 另一个相关问题,我在视图中拥有的其他轻击手势识别器会如何影响这一点?我有几个 UIButtons 会导致制作 TapGestureRecognizers,它们会在点击时创建一个形状,然后删除识别器。如果我这样做,会不会弄乱 UIView 的触摸...功能?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2015-05-21
      • 2016-05-24
      • 2011-05-28
      • 2017-08-04
      相关资源
      最近更新 更多