Как получить цвет пикселя при касании (Swift)?

У меня есть различные CAShapeLayers, каждый из которых имеет свой цвет, сделанный следующим образом:

    shape1.strokeColor = UIColor(red: 85/255.0, green: 176/255.0, blue: 112/255.0, alpha: 1.0).
    shape2.strokeColor = UIColor(red: 222/255.0, green: 171/255.0, blue: 66/255.0, alpha: 1.0).CGColor

Используя функцию touchesBegan, я хочу определить, была ли нажата CAShapeLayer и какая именно, чтобы произошло подходящее действие. Я знаю, что можно использовать hitTest и CGPathContainsPoint, но я хочу использовать другой метод. Как сравнить цвет нажатой точки с цветом CAShapeLayers?

Любая помощь будет оценена


person John    schedule 22.04.2015    source источник
comment
Сначала вы должны выяснить, на каком CAShapeLayer находится точка, с помощью CGPathContainsPoint, а затем проверить цвет этого слоя.   -  person Dejan Skledar    schedule 22.04.2015
comment
К сожалению, все мои CAShapeLayer имеют один и тот же путь (поскольку все они являются секторами одного и того же круга), а это означает, что CGPathContainsPoint не предоставит уникальный CAShapeLayer. Есть ли другой способ?   -  person John    schedule 22.04.2015


Ответы (1)


Этот метод должен работать для определения цвета пикселя точки касания:

func colorAtPoint(point:CGPoint) -> UIColor
{
    var pixels = UnsafeMutablePointer<CUnsignedChar>.alloc(4)

    var colorSpace = CGColorSpaceCreateDeviceRGB()
    var bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)
    var context = CGBitmapContextCreate(pixels, 1, 1, 8, 4, colorSpace, bitmapInfo)

    CGContextTranslateCTM(context, -point.x, -point.y)

    shapeLayer.renderInContext(context)


    var color:UIColor = UIColor(red: CGFloat(pixels[0])/255.0, green: CGFloat(pixels[1])/255.0, blue: CGFloat(pixels[2])/255.0, alpha: CGFloat(pixels[3])/255.0)

    pixels.dealloc(4)

    return color
}
person Dejan Skledar    schedule 22.04.2015
comment
Будет ли это работать для strokeColor CAShapeLayer (не только fillColor)? - person John; 22.04.2015
comment
Это должно работать для любого цвета на экране, который корректно виден. - person Dejan Skledar; 22.04.2015
comment
И вы бы использовали простой оператор if для сравнения двух цветов? - person John; 22.04.2015