El button UIB en la parte inferior de la pantalla solo destaca intermitentemente.

Tengo algunos botones UIB en la parte inferior de la vista principal de mi aplicación. Estos botones intermitentemente no resaltan cuando un usuario los toca, pero sus methods de destino siempre son llamados. Descubrí que el reconocimiento de gestos de Control Center se interpone con el resaltado de UIButton. Si muevo la vista que contiene hacia la mitad de la pantalla, todo funciona como está diseñado.

El problema se informa aquí https://devforums.apple.com/message/865922

Como una solución he intentado establecer el estado resaltado a mano con el método de destino. Esto parece tener el mismo efecto de permitir que el button UIB resalte normalmente.

¿Alguna idea de cómo solucionar esto sin networkingiseñar estos controles para que aparezca en otra parte de la aplicación?

¿Quizás uso una vista estándar y agrego todos los methods para la interacción táctil a mano? ¿Como podría hacerlo? ¿Vale la pena explorar?

Encontré una solución bastante simple para esto. El uso de properties estándar como .highlighted = YES y .selected = YES no parece funcionar dentro de esa banda inferior. En lugar de establecer el estado resaltado, acabo de establecer la image de background del button en el estado resaltado con una demora no percibida ANTES de que llamemos al método final.

[self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateHighlighted]; [self.stopRecordingButton addTarget:self action:@selector(stopRecordingDelay) forControlEvents:UIControlEventTouchUpInside]; -(void)stopRecordingDelay { [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateNormal]; [self performSelector:@selector(stopRecording) withObject:nil afterDelay:0.025f]; } - (void)stopRecording { [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; //Do real stuff } 

Recientemente me encontré con el mismo problema y busqué en todas partes una respuesta. Esto es lo que funcionó para mí. Fue una combinación de dos cosas, el gesto de deslizar el UINavigationController retroceso UINavigationController y el gesto del centro de control iOS 7 (deslizar hacia arriba desde la parte inferior de la pantalla).

Deshabilite el gesto de deslizar hacia atrás si en un UINavigationController :

en viewDidLoad :

 if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } 

Establezca el gesto del centro de control para que solo muestre una flecha hacia arriba en lugar de mostrar primero el centro de control. Puede hacer esto anulando el siguiente método UIViewController:

 - (BOOL)prefersStatusBarHidden { return YES; } 

¡Espero que esto ayude!

He publicado una corrección para este problema que hace que el punto culminante se describa nuevamente en esta pregunta . El punto culminante se fija subclarando UIButton y overriding pointInside: para capturar events táctiles

Si tiene un button que cubre toda la parte inferior de la pantalla, puede encontrarse con un problema en el que solo la parte izquierda tiene este retraso.

Para normalizar el time de realimentación para todo el button, se puede usar la siguiente solución
(una versión mejorada de Aaron Shekey's):

 NSDate *touchDownTime; - (void)touchDown { self.alpha = 0.7; touchDownTime = [NSDate date]; } - (void)touchUpInside { // basically at least 80ms feedback is guaranteed this way // note: timeIntervalSinceNow returns negative NSTimeInterval feedbackTimeLeftToShow = MAX(0.08 + [touchDownTime timeIntervalSinceNow], 0.001); [self performSelector:@selector(touchUpInsideAfterFeedback) withObject:nil afterDelay:feedbackTimeLeftToShow]; } - (void)touchUpInsideAfterFeedback { self.alpha = 1; } 

nota: performSelector puede funcionar bien con valores de retraso negativos, pero es mejor estar seguro que lamentar