2015-10-05 2 views

ответ

0

На самом деле я нашел его на это, как и прекрасно работает:

How to know that if the only visible area of a .png is touched in XCode (swift or objective C)

Но должны изменить код, как показано ниже:

func alphaFromPoint(point: CGPoint) -> CGFloat { 
    var pixel: [UInt8] = [0, 0, 0, 0] 
    let colorSpace = CGColorSpaceCreateDeviceRGB(); 
    let alphaInfo : CGBitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue) 
    let context = CGBitmapContextCreate(&pixel, 1, 1, 8, 4, colorSpace, alphaInfo.rawValue) //need add .rawValue to alphaInfo 

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

    self.layer.renderInContext(context!) 

    let floatAlpha = CGFloat(pixel[3]) 
    return floatAlpha 

}

+0

Чтобы игнорировать подсветку на кране, нам нужно установить btnCustom.adjustsImageWhenHighlighted = false –

2

Идея заключается в том, чтобы иметь подкласс UIButton, который переопределяет следующие методы:

func hitTest(_ point: CGPoint, 
    withEvent event: UIEvent?) -> UIView? // that's for handling the case of multiple custom subviews on your view rather than for evaluating if it's your view to handle the touch 

и

func pointInside(_ point: CGPoint, 
     withEvent event: UIEvent?) -> Bool // way more preferable than hit test in your case!!! 

Существует учебник в Objective-C, который использует удар тест (просто чтобы поймать идею). В вашем случае самая сложная проблема заключается в том, чтобы определить, находится ли полученное местоположение касания в пределах вашей пользовательской формы (в приведенном выше руководстве говорится о прозрачности пикселей, что не относится к вам). Я предполагаю, что вы рисуете форму, используя путь Безье. Если это то, что вы делаете, вы можете реализовать точку внутри оценки с помощью func containsPoint(_ point: CGPoint) -> Bool UIBezierPath. Удачи. также одна сложная вещь P.S.There в о UIBezierPath:

Точка не считаются вложиться по пути, если он находится внутри открытого Подпути, независимо от того, будет ли эта область будет окрашена во время операции заполнения. Поэтому, чтобы определить образы мыши по открытым путям , вы должны создать копию объекта пути и явно закрыть любые подпутники (используя метод closePath) перед вызовом этого метода.

+0

Спасибо за ваше предложение –

+0

Всегда приветствуются. Пожалуйста, LMK, если он сработает. –

+0

Хорошо, спасибо за помощь –