我有一个UIImageView替换图像。此视图的图层被CAShapeLayer遮罩,以便在图像中创建圆形“孔”。为了创建孔,我将UIBezierPath.usesEvenOddFillRule = true一起使用。

静态时可以正常工作。但是我需要那个孔来用用户的手指移动。为此,我每次用户移动手指时都使用奇数规则创建新的UIBezierPath。在具有较小图像的较小手机上看起来还可以,但在iPhone 6 Plus上则显得断断续续。

关于如何使其平滑的任何想法都是非常好的。我不能只移动蒙版CAShapeLayer的框架-它会移动打孔机器人,并且还会隐藏图像的某些边缘。因此,唯一的方法是每次用户移动手指时都要更改其.path,这很慢。



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

迄今为止存在的无效解决方案是:


用图像显示部分的边界创建UIBezierPath
在其上设置“均匀填充规则”
将孔的UIBezierPath添加到其中
用一些不透明的填充颜色将其设置为CAShapeLayer的路径
使用该CAShapeLayer作为UIImageView的掩码


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

最佳答案

它会移动打孔机器人,还会隐藏图像的某些边缘


好吧,我不同意。移动遮罩正是这样做的方法。我不明白您为什么认为这有问题。可能的问题仅仅是您没有使遮罩层足够大。它的大小不必与要遮罩的图层相同。在这种情况下,它需要约为被遮罩层(水平的3个和垂直的3个)的9倍,以便无论用户沿任何方向滑动遮盖的层,它都将继续覆盖被遮盖的层。

关于ios - 顺利移动UIImage中的孔?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35762289/

10-12 07:32
查看更多