Получить средний цвет UIView в пределах диапазона - PullRequest
0 голосов
/ 29 января 2020

Я строю UIButton, который, когда в UIScrollView меняет цвет, чтобы контрастировать со средним цветом вида позади него. Для этого я написал следующие функции:

extension UIView {

    func getPixelColor(from origin: CGPoint, with width: CGFloat, with height: CGFloat) -> CGFloat {
        var x = origin.x
        var y = origin.y
        var vals: [CGFloat] = []

        while x < origin.x + width {
            while y < origin.y + height {
                let pixel = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: 4)
                let colorSpace = CGColorSpaceCreateDeviceRGB()
                let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
                let context = CGContext(data: pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)

                context!.translateBy(x: x, y: y)
                layer.render(in: context!)
                let color = UIColor(red: CGFloat(pixel[0])/255.0,
                                    green: CGFloat(pixel[1])/255.0,
                                    blue: CGFloat(pixel[2])/255.0,
                                    alpha: CGFloat(pixel[3])/255.0)
                pixel.deallocate()
                vals.append(color.avg)
                y += 1
            }
            x += 1
        }

        let sumArray = vals.reduce(0, +)
        let avgArrayValue = CGFloat(sumArray) / CGFloat(vals.count)
        return avgArrayValue
    }

}

Проблема здесь в том, что я хочу получить средний цвет в определенном диапазоне, но сейчас эта функция выполняется слишком медленно, чтобы выполняться каждый раз, когда UIScrollView ходов. У кого-нибудь есть какие-либо предложения о том, как исправить эту функцию / проблему, будет признателен.

...