Crear un UIButton en forma de la image dada

¿Cómo puedo crear un button UIB en forma de la image dada?

Soy capaz de crear algo cerca de él, pero la image parece no encajar en el button. mi requerimiento es la image que se muestra a continuación. es decir, semicírculo

El código que solía crear el button se muestra a continuación.

¿Qué cambios debo hacer en la siguiente image para get este button? subview ps-add realizada en otra class …

btnStartGame =[UIButton buttonWithType:UIButtonTypeCustom]; [btnStartGame setFrame:CGRectMake(60, 200, 200, 200)]; btnStartGame.titleLabel.font=[UIFont fontWithName:@"Helvetica-Bold" size:30]; [btnStartGame setImage: [UIImage imageNamed:@"Draw button.png"] forState:UIControlStateNormal]; btnStartGame.titleLabel.textColor=[UIColor networkingColor]; btnStartGame.clipsToBounds = YES; btnStartGame.layer.cornerRadius = 50;//half of the width btnStartGame.layer.borderColor=[UIColor networkingColor].CGColor; btnStartGame.layer.borderWidth=2.0f; btnStartGame.tag=20; btnStartGame.highlighted=NO; 

Hay un gran tutorial aquí con un código fuente descargable:

http://iphonedevelopment.blogspot.co.uk/2010/03/irregularly-shaped-uibuttons.html

En esencia, necesita crear una categoría en UIImage, que comtesting si el punto que ha tocado es transparente o no. Esto significa que puede usarlo para verificar las testings de impacto en forms irregulares.

A continuación, subclasss el button UIB y superas el hitTest: withEvent:

Espero que esto ayude

Aunque la solución de Jeff Lamarche vinculada por la otra respuesta funciona bien, usa mucha memory y / o hace mucho trabajo:

  • Si crea NSData una vez en el inicializador, termina sosteniendo un bloque de memory relativamente grande durante la vida útil de cada button
  • Si lo haces transitorio, como se hace en la respuesta, entonces terminas convirtiendo la image completa cada vez que presionas tu button, ¡procesando miles de píxeles y tirando el resultado después de search un solo byte!

Resulta que puede hacerlo mucho más eficientemente, tanto en términos de consumo de memory como de consumo de CPU, siguiendo el enfoque descrito en esta respuesta .

Subclass UIButton , y anule su pointInside:withEvent: método como este:

 -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { if (![super pointInside:point withEvent:event]) { return NO; } unsigned char pixel[1] = { 0 }; CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 1, NULL, (CGBitmapInfo)kCGImageAlphaOnly); UIGraphicsPushContext(context); UIImage *image = [self backgroundImageForState:UIControlStateNormal] ; [image drawAtPoint:CGPointMake(-point.x, -point.y)]; UIGraphicsPopContext(); CGContextRelease(context); return pixel[0] != 0; } 

El código anterior toma alfa de la image de background del button. Si su button usa otra image, cambie la línea que inicializa la variable de image anterior.