iOS:进行透明度测试的最佳方法?

时间:2019-07-08 22:29:08

标签: ios swift uiview transparency hittest

我的应用有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 +

运行时间分析器之后:

enter image description here

enter image description here

每一个垂直的“摩天大楼”(例如CPU密集型工作块)都是在任意一个UIView旋转/拖动时进行的。在清除之前,它们每个都会产生大约700-1000ms的延迟,这些都在我上面上传的代码中。

0 个答案:

没有答案