UIImageview 掩码响应手势更新太慢
UIImageview mask updating too slowly in response to gesture
我需要创建一个组件,让用户可以从图像中的 2 个选项中进行选择。首先,您会看到 2 张并排的图像,中间有一个 "handle"。如果将手柄向左移动,您会看到右侧的图像更多,左侧的图像更少,从而显示右侧的图像,反之亦然。
从技术上讲,我有 2 个全尺寸 UIImageView
s,一个放在另一个上面,并且它们被遮盖了。我有一个平移手势,当用户滑动手柄时,手柄会移动并且遮罩会自行更新以调整为 "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()```.
这个对我帮助很大。还有一个很好的解释。
希望这对其他人有帮助。
我需要创建一个组件,让用户可以从图像中的 2 个选项中进行选择。首先,您会看到 2 张并排的图像,中间有一个 "handle"。如果将手柄向左移动,您会看到右侧的图像更多,左侧的图像更少,从而显示右侧的图像,反之亦然。
从技术上讲,我有 2 个全尺寸 UIImageView
s,一个放在另一个上面,并且它们被遮盖了。我有一个平移手势,当用户滑动手柄时,手柄会移动并且遮罩会自行更新以调整为 "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()```.
这个
希望这对其他人有帮助。