我的应用有5张不规则形状的图像,彼此重叠。每个图像的边缘都具有透明性,并且每个图像都小于其下面的图像。想象一下,在较大的玻璃杯上方的安全玻璃杯中,在较大的玻璃杯上方等...
我需要能够彼此独立且同时拖动/旋转这些视图。
我可以使用它,但是当手指第一次开始拖动所需的视图时会出现大量延迟。
我将其范围缩小为以下两种方法:
class BSBTouchableRotatingImageView: UIImageView
{
func alphaFromPoint(point: CGPoint) -> CGFloat
{
var pixel: [UInt8] = [0, 0, 0, 0]
let colorSpace = CGColorSpaceCreateDeviceRGB();
let alphaInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
let context = CGContext(data: &pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: alphaInfo.rawValue)
context!.translateBy(x: -point.x, y: -point.y);
self.layer.render(in: context!)
let floatAlpha = CGFloat(pixel[3])
return floatAlpha
}
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool
{
let result = self.alphaFromPoint(point: point) > 0.0
return result
}
}
很明显,如果我将这些注释掉,则滞后消失了,但是由于iOS并未忽略UIView中的透明性,因此只能触摸最顶部的视图。
是否有更有效,更高效的方法?
我需要能够支持iOS 9 +
运行时间分析器之后:
每一个垂直的“摩天大楼”(例如CPU密集型工作块)都是在任意一个UIView旋转/拖动时进行的。在清除之前,它们每个都会产生大约700-1000ms的延迟,这些都在我上面上传的代码中。