UIImageview模板响应手势更新太慢

时间:2017-09-25 19:20:54

标签: ios uiimageview uigesturerecognizer mask

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

从技术上讲,我有2个全尺寸UIImageView一个在另一个上面,它们被屏蔽了。我有一个平移手势,当用户滑动手柄时,手柄会移动,并且面具会自动更新以调整为“#34;新中间位置”。

这是负责调整图像掩码的代码。常量在手势调用的方法中计算。我知道我对这个常数的计算是好的,因为"句柄"并且掩码正确更新。

BUT

蒙版更新得太晚,拖动时,我们发现它的调整太晚了。

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

所以回顾一下,我的问题实际上是关于表现。图像视图正在正确调整,但速度太慢。带有约束的"句柄"会很快得到更新。

1 个答案:

答案 0 :(得分:0)

显然,CALayer试图对其属性的大多数更改进行动画处理。所以我看到的延迟实际上是由于动画造成的。

我通过adjustImagesMasks()CATransaction.setValue(kCFBooleanTrue, forKey:kCATransactionDisableActions)来调用CATransaction.commit()来解决我的问题。因此,对于此次交易,我要求不对更改进行动画处理。因为这是连续的(使用平移手势),它是无缝的。

完整代码:

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

other post给了我很多帮助。还有一个很好的解释。

希望这有助于其他人。