Cocoa Touch – Forma personalizada de UIButton

¿Cómo puedo hacer que el área del button táctil sea de la misma forma que la image provista?
Digamos que tengo un button personalizado con una image triangular, ¿cómo puedo asegurarme de que solo se procesen los toques dentro de ese triángulo?

¿O tengo que hacer algún tipo de matemáticas en la function de acción táctil?

OBShapedButton es un gran proyecto para eso

Funciona subclarando UIButton y -pointInside:withEvent:

 @implementation OBShapedButton // UIView uses this method in hitTest:withEvent: to determine which subview // should receive a touch event. // If pointInside:withEvent: returns YES, then the subview's hierarchy is // traversed; otherwise, its branch // of the view hierarchy is ignonetworking. - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { // Return NO if even super returns NO (ie if point lies outside our bounds) BOOL superResult = [super pointInside:point withEvent:event]; if (!superResult) { return superResult; } // We can't test the image's alpha channel if the button has no image. // Fall back to super. UIImage *buttonImage = [self imageForState:UIControlStateNormal]; if (buttonImage == nil) { return YES; } CGColorRef pixelColor = [[buttonImage colorAtPixel:point] CGColor]; CGFloat alpha = CGColorGetAlpha(pixelColor); return alpha >= kAlphaVisibleThreshold; } @end 

[aUIImage colorAtPixel:point] es un método de categoría que se adjunta.

Esta característica definitivamente no es proporcionada por las classs básicas de toque de cocoa relacionadas con un UIButton. Supongo que tendrías que search en subclassar UIButton e interceptar los toques como mencionaste.

El proyecto OBShapedButton de Ole debería ser referencedo más en SO. Gracias a vikingosegundo, quién es mi ejemplo de progtwigción, github ha ayudado en el pasado, puedes ver algo de lo que Ole creó para quitar las acciones de la parte de background transparente de un UIB personalizado. Agregué esto a mi proyecto y pude ponerlo en marcha con estos pasos.

  1. download el proyecto
  2. agregue los files UIImage + ColorAtPixel.h / m y OBShapedButton.h / m a la carpeta de su proyecto
  3. asegúrese de que los files .m se agreguen a la list de Fases de compilation> Orígenes de compilation de su objective
  4. cambie el tipo de class UIButton de todos sus botones a la class OBShapedButton en IB
  5. asegúrese de que su file .png tenga un background transparente y que sea la "Imagen" del button

Este proyecto ayudará a cualquier persona que tenga múltiples UIBs superpuestos que tengan backgrounds transparentes, incluso si están en diferentes UIViews o completamente cubiertos por otro UIB (por ejemplo, no puede seleccionarlo en IB sin el Editor> Organizar> Enviar a Atrás / Frente) . Sin embargo, si tiene un OBShapedButton en una UIView, donde parte de la UIView transparente se superpone a un OBShapedButton, no puede recibir el evento de clic o arrastre en la parte cubierta de UIView del OBShapedButton, así que acople sus UIViews con esto en mente.

Descarga los proyectos de Ole y vikingo para tu colección tutorial … ¡HAZLO!