UIImageview 掩码响应手势更新太慢
Posted
技术标签:
【中文标题】UIImageview 掩码响应手势更新太慢【英文标题】:UIImageview mask updating too slowly in response to gesture 【发布时间】:2017-09-25 19:20:53 【问题描述】:我需要创建一个组件,让用户从图像中的 2 个选项中进行选择。起初,您会看到 2 个并排的图像,中间有一个“手柄”。如果将手柄向左移动,您会看到更多的右侧图像而更少的左侧图像,以显示右侧图像,反之亦然。
从技术上讲,我有 2 个全尺寸 UIImageView
s 一个在另一个之上,并且它们被蒙面。我有一个平移手势,当用户滑动手柄时,手柄会移动,遮罩会自行更新以适应“新中间”。
这是负责调整图像蒙版的代码。常量在手势调用的方法中计算。我知道我对该常数的计算很好,因为“句柄”和掩码已正确更新。
但是
遮罩更新太晚了,拖动时,我们看到它调整得太晚了。
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 掩码响应手势更新太慢的主要内容,如果未能解决你的问题,请参考以下文章
UIImageView + UIImage vs CALayer + 内容效率