我需要创建一个组件,让用户从图像中的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
所以回顾一下,我的问题实际上是关于表现。图像视图正在正确调整,但速度太慢。带有约束的"句柄"会很快得到更新。
答案 0 :(得分:0)
显然,CALayer试图对其属性的大多数更改进行动画处理。所以我看到的延迟实际上是由于动画造成的。
我通过adjustImagesMasks()
和CATransaction.setValue(kCFBooleanTrue, forKey:kCATransactionDisableActions)
来调用CATransaction.commit()
来解决我的问题。因此,对于此次交易,我要求不对更改进行动画处理。因为这是连续的(使用平移手势),它是无缝的。
完整代码:
CATransaction.setValue(kCFBooleanTrue, forKey:kCATransactionDisableActions)
adjustImagesMasks(to: newConstant)
CATransaction.commit()```.
这other post给了我很多帮助。还有一个很好的解释。
希望这有助于其他人。