UIImageview 掩码响应手势更新太慢

Posted

技术标签:

【中文标题】UIImageview 掩码响应手势更新太慢【英文标题】:UIImageview mask updating too slowly in response to gesture 【发布时间】:2017-09-25 19:20:53 【问题描述】:

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

从技术上讲,我有 2 个全尺寸 UIImageViews 一个在另一个之上,并且它们被蒙面。我有一个平移手势,当用户滑动手柄时,手柄会移动,遮罩会自行更新以适应“新中间”。

这是负责调整图像蒙版的代码。常量在手势调用的方法中计算。我知道我对该常数的计算很好,因为“句柄”和掩码已正确更新。

但是

遮罩更新太晚了,拖动时,我们看到它调整得太晚了。

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】:

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

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

完整代码在这里:

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

这个other post 帮助了我很多。也有很好的解释。

希望这对其他人有所帮助。

【讨论】:

以上是关于UIImageview 掩码响应手势更新太慢的主要内容,如果未能解决你的问题,请参考以下文章

iOS:UIImageView 不响应动画之间的点击手势

如何在点击手势上为 UIImageView 设置动画?

重叠视图和手势识别器 iPhone

UIImageView + UIImage vs CALayer + 内容效率

无法将类型“[PHAsset]”的值分配给类型“UIImageView!”

设置图像属性时,UIImageView 图像不会明显更新