Saltar los botones y simplemente responder a toques en su vista que contiene el círculo.
Cree un CGPath para cada área que desee capturar toques, cuando su UIview recibe un toque, verifique la membresía dentro de las rutas.
[respuesta Editado para mostrar los detalles de implementación esqueleto - TomH]
Así es como me gustaría abordar el problema: (no he probado este código y la sintaxis puede que no sea del todo bien, pero esto es la idea general)
1) Utilizando PS o su aplicación de creación de imagen favorita, cree una png de los cuartos de círculos. Agrégalo a tu proyecto XCode.
2) Agregue una UIView a la IU. Establezca el contenido de la capa de UIView en png.
self.myView = [[UIView alloc] initWithRect:CGRectMake(10.0, 10.0, 100.0, 100,0)];
[myView.layer setContents:(id)[UIImage loadImageNamed:@"my.png"]];
3) Cree CGPaths que describan la región en la UIView que le interesa.
self.quadrantOnePath = CGPathCreateMutable();
CGPathMoveToPoint(self.quadrantOnePath, NULL, 50.0, 50.0);
CGPathAddLineToPoint(self.quadrantOnePath, NULL, 100.0, 50.0);
CGPathAddArc(self.quadrantOnePath, NULL, 50.0, 50.0, 50.0, 0.0, M_PI2, 1);
CGPathCloseSubpath(self.quadrantOnePath);
// create paths for the other 3 circle quadrants too!
4) Añadir un UIGestureRecognizer y escuchar/observar por los grifos en la vista
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
[tapRecognizer setNumberOfTapsRequired:2]; // default is 1
5) Cuando tapRecognizer invoca su selector de destino
- (void)handleGesture:(UIGestureRecognizer *) recognizer {
CGPoint touchPoint = [recognizer locationOfTouch:0 inView:self.myView];
bool processTouch = CGPathContainsPoint(self.quadrantOnePath, NULL, touchPoint, true);
if(processTouch) {
// call your method to process the touch
}
}
No se olvide de liberar todo cuando corresponda, use CGPathRelease para liberar rutas.
Otro pensamiento: Si el gráfico que está utilizando para representar los cuadrantes del círculo es simplemente un color relleno (es decir, sin gráficos extravagantes, efectos de capa, etc.), también podría usar las rutas que creó en el método drawRect de UIView dibujar los cuadrantes también Esto resolvería uno de los fallos del enfoque anterior: no hay una integración ajustada entre el gráfico y las rutas utilizadas para verificar los toques. Es decir, si intercambia el gráfico por algo diferente, cambia el tamaño del gráfico, etc., las rutas utilizadas para verificar los toques estarán desincronizadas. Potencialmente una pieza de código de alto mantenimiento.
Si fuera tan sencillo. Mi necesidad es una rotación de 45 grados, así que desafortunadamente no es tan simple. – David26th
Ahora veo el problema – vikingosegundo
@ David26th Vea mi edición – vikingosegundo