iOS: самое оптимальное средство для проверки на прозрачность? - PullRequest
1 голос
/ 09 июля 2019

Мое приложение имеет 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

Каждый из этих вертикальных «небоскребов», похожих на блоки интенсивной работы процессора, - это когда любой из UIViews вращается / перетаскивается.Каждый из них выдает примерно 700 - 1000 мс до очистки, и все это в коде, который я загрузил выше.

...