UIImageview 掩码响应手势更新太慢

UIImageview mask updating too slowly in response to gesture

我需要创建一个组件,让用户可以从图像中的 2 个选项中进行选择。首先,您会看到 2 张并排的图像,中间有一个 "handle"。如果将手柄向左移动,您会看到右侧的图像更多,左侧的图像更少,从而显示右侧的图像,反之亦然。

从技术上讲,我有 2 个全尺寸 UIImageViews,一个放在另一个上面,并且它们被遮盖了。我有一个平移手势,当用户滑动手柄时,手柄会移动并且遮罩会自行更新以调整为 "the new middle"。

下面是负责调整图像遮罩的代码。该常量是在手势调用的方法中计算的。我知道我对该常数的计算很好,因为 "handle" 和掩码已正确更新。

但是

蒙版更新太晚,拖动时我们看到调整得太晚。

func adjustImagesMasks(to constant: CGFloat) {
    choiceImageA.mask?.willChangeValue(forKey: "frame")
    choiceImageB.mask?.willChangeValue(forKey: "frame")

    let separationPoint: CGFloat = self.frame.width / 2.0 + constant

    maskA.backgroundColor = UIColor.black.cgColor
    maskA.frame = CGRect(origin: .zero, size: CGSize(width: separationPoint, height: self.frame.size.height))

    maskB.backgroundColor = UIColor.black.cgColor
    maskB.frame = CGRect(x: separationPoint, y: 0, width: self.frame.width - separationPoint, height: self.frame.size.height)

    choiceImageA.mask?.didChangeValue(forKey: "frame")
    choiceImageB.mask?.didChangeValue(forKey: "frame")

    maskA.drawsAsynchronously = true
    maskB.drawsAsynchronously = true

    self.setNeedsDisplay()
    maskA.setNeedsDisplay()
    maskA.displayIfNeeded()
    maskB.setNeedsDisplay()
    maskB.displayIfNeeded()
}

图像视图的蒙版设置如下:

maskA = CALayer()
maskB = CALayer()
choiceImageA.layer.mask = maskA
choiceImageA.layer.masksToBounds = true
choiceImageB.layer.mask = maskB
choiceImageB.layer.masksToBounds = true

总而言之,我的问题实际上是关于性能的。图像视图正在正确调整,但速度太慢。有约束定位的[​​=27=],更新速度非常快。

很明显,CALayer 试图为其属性的大部分更改设置动画。所以我看到的延迟实际上是由于动画。

我通过用 CATransaction.setValue(kCFBooleanTrue, forKey:kCATransactionDisableActions)CATransaction.commit() 围绕对 adjustImagesMasks() 的调用解决了我的问题。因此,对于此事务,我要求不要对更改进行动画处理。因为这是连续的(用平移手势),所以是无缝的。

完整代码在这里:

CATransaction.setValue(kCFBooleanTrue, forKey:kCATransactionDisableActions)
adjustImagesMasks(to: newConstant)
CATransaction.commit()```.

这个对我帮助很大。还有一个很好的解释。

希望这对其他人有帮助。