【问题标题】:Smootly mooving a hole in UIImage?在 UIImage 中顺利移动一个洞?
【发布时间】:2016-03-03 02:51:58
【问题描述】:

我有一个 UIImageView 显示图像。该视图的图层被CAShapeLayer 遮罩,以便在图像中创建圆形“洞”。为了创建洞,我使用UIBezierPath.usesEvenOddFillRule = true

静态时效果很好。但我需要那个洞用用户手指移动。为此,每次用户移动手指时,我都会使用奇偶规则创建新的UIBezierPath。在具有较小图像的较小手机上,它看起来还可以,但在 iPhone 6 Plus 上它是不稳定的。

任何关于如何使其顺利的想法都非常受欢迎。我不能只移动遮罩CAShapeLayer 的框架 - 它会移动孔机器人也会隐藏图像的一些边缘。所以唯一的方法是每次用户移动手指时改变它的.path,这很慢。


编辑: matt's answer 可以在某些情况下工作,但不适用于我的情况:我没有显示整个图像,只显示由UIBezierPath 定义的一部分。这部分通常是椭圆形的(但可以是矩形或圆角矩形),并且在其中切有“孔”。当用户用手指修剪孔时,图像的显示部分/形状不会改变 - 它是静态的。

到目前为止,效率低下的解决方案是:

  1. 创建带有图像显示部分边界的UIBezierPath
  2. 在其上设置“均匀填充规则”
  3. 将洞的UIBezierPath添加到它
  4. 将其设置为CAShapeLayer 的路径,并带有一些不透明的填充颜色
  5. 使用CAShapeLayer 作为UIImageView 的掩码

每次用户移动手指时都会重复此过程。我不能简单地移动整个遮罩层,因为这也会改变正在显示的图像部分。我要保持静止并只移动其中的洞。

【问题讨论】:

    标签: ios performance rendering calayer uibezierpath


    【解决方案1】:

    它会移动孔机器人并隐藏图像的一些边缘

    好吧,我不同意。移动遮罩正是这样做的方式。我不明白你为什么认为这有问题。也许问题仅仅是你没有把遮罩层做得足够。它不必与它所掩蔽的层大小相同。在这种情况下,它需要大约是被遮罩层大小的 9 倍(3 个水平和 3 个垂直),这样无论用户在任何方向滑动多远,它都会继续覆盖被遮罩的层。

    【讨论】:

    • 屏蔽图像视图并屏蔽其超级视图。
    • 是的,应该可以!我的观点层次结构和许多其他因素我没有在这里提到以保持简单......但如果我想不出任何其他方式,我将别无选择,只能做这项工作。谢谢。
    • 当然。在您的另一个问题中,您询问了如何将一层蒙版两次。但是你没有解释你真正想要做什么。超层蒙版掩盖子层。所以屏蔽 two 层,一层是另一层的子视图。只需为图像视图创建一个与图像视图相同大小的超级视图,仅用于屏蔽它。我一直都在做这种事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多