Botón de círculo en iOS

¿Es posible crear dos botones que se muestran como la image de abajo? Puede parecer que debería usar UIButton o UIImageView, pero si hago clic en el área 1, todavía actúa como si hubiera hecho clic en el button 1. El button 2 debería activarse cuando hago clic también en el área 1.

introduzca la descripción de la imagen aquí

Si las respuestas anteriores no son aceptables, podría implementar una subclass personalizada de UIButton que invalida el pointInside:withEvent:

Suponiendo que su vista sea exactamente cuadrada y el gráfico sea exactamente circular y que llene el cuadrado completo, un ejemplo podría ser:

 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { // check that the point is at least inside the normal rect if(![super pointInside:point withEvent:event]) return NO; // we'll assume a square view with an exact circle inside, so // the radius of the circle is just half the width CGFloat radius = self.bounds.size.width*0.5f; // the point (radius, radius) is also the centre of the view, so... CGFloat squareOfDistanceFromCentre = (radius - point.x)*(radius - point.x) + (radius - point.y)*(radius - point.y); // if the point is too far away, return NO if(squareOfDistanceFromCentre > radius*radius) return NO; // otherwise we've exhausted possible reasons for answering NO return YES; } 

Puede hacer un button circular cortando la capa y configurando el radio de su button.

[[capa de botones] setCornerRadius: 8.0f];

También puedes probar con el radio de cambio.

Sí, por supuesto que es posible.

Puede conectar una sola acción con más de un selector a través de IB.
También puede llamar directamente al método disparado por el button2 desde el interior del método disparado por el button1.

Es bastante complicado, pero posible: puedes usar solo un button, pero poner algo de verificación después del evento touchUpInside. Debería calcular si este punto de contacto se encuentra dentro del círculo de "button1". Para esta tarea, necesita tener algún conocimiento matemático: ¿Cómo calculo un punto en la circunferencia de un círculo?

Establezca userInteractionEnabled en NO para el button más pequeño 1. Todos los events irán al button más grande 2.

He creado dos botones rectangulares networkingondos para este propósito, uno de ellos es largo y delgado, y el otro es más ancho. Juntos, construyen una forma como un signo más chubby, que está bastante cerca de un círculo, considerando que Apple acepta 44 px como el tamaño mínimo que se puede presionar cómodamente. Si desea que la image cambie, configure otra image en su estado de image para el estado resaltado y conecte varias acciones (el toque no será suficiente si desea imitar el estado resaltado de los botones en la vista de la image) de los dos botones. Alternativamente, puede agregar observadores y alterar el estado resaltado de la image según los botones

Una forma limpia de tratar pointInside en un button circular es esta:

 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { if (![super pointInside:point withEvent:event]) { return NO; } BOOL isInside = (pow((point.x-self.frame.size.width/2), 2) + pow((point.y - self.frame.size.height/2), 2) < pow((self.frame.size.width/2), 2)) ? YES:NO; return isInside; } 

Puede deshacerse de la variable 'isInside', pero de esta manera es más fácil de probar.