UIButton touch se retrasa cuando en UIScrollView

Me estoy encontrando con un pequeño problema en mi aplicación.

Básicamente, tengo una serie de UIButtons agregados como subvistas en un UIScrollView que es parte de un plumín. Cada vez que toco un botón, hay un retraso notable antes de que se resalte el botón. En esencia, tengo que mantenerlo durante aproximadamente medio segundo antes de que el botón se atenúe y aparezca seleccionado.

Supongo que esto se debe a que UIScrollView necesita determinar si el toque es un desplazamiento o si se trata de un toque destinado a una subvista.

De todos modos, no estoy seguro de cómo proceder. Simplemente quiero que el botón aparezca seleccionado tan pronto como lo toque.

¡Cualquier ayuda es apreciada!

Editar:

He intentado configurar delaysContentTouches en NO, pero el desplazamiento se vuelve casi imposible ya que la mayoría de mis scrollView están llenos de UIButtons .

La solución de Jeff no me funcionaba del todo, pero esta similar: http://charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state

No estoy seguro de si este fue el caso de la respuesta de Jeff, pero además de los touchesShouldCancelInContentView en su subclase de vista de desplazamiento, aún necesita establecer delaysContentTouches en false . Por último, en lugar de devolver false para sus botones, debe volver true . Aquí hay un ejemplo del enlace de arriba:

C objective:

 - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.delaysContentTouches = false; } return self; } - (BOOL)touchesShouldCancelInContentView:(UIView *)view { if ([view isKindOfClass:UIButton.class]) { return true; } return [super touchesShouldCancelInContentView:view]; } 

Swift 4:

 override func touchesShouldCancel(in view: UIView) -> Bool { if view is UIButton { return true } return super.touchesShouldCancel(in: view) } 

Ok, he resuelto esto subclasificando UIScrollView y reemplazando touchesShouldCancelInContentView

¡Ahora mi UIButton que fue etiquetado como 99 se destaca correctamente y mi scrollview se está desplazando!

myCustomScrollView.h :

 @interface myCustomScrollView : UIScrollView { } @end 

y myCustomScrollView.m :

 @implementation myCustomScrollView - (BOOL)touchesShouldCancelInContentView:(UIView *)view { NSLog(@"touchesShouldCancelInContentView"); if (view.tag == 99) return NO; else return YES; } 

Intente establecer la propiedad UIScrollView delaysContentTouches en NO.

Solución de guión gráfico: seleccione la vista de desplazamiento, abra el “Inspector de atributos” y desmarque “Retrasar toques de contenido”

enter image description here

En Swift 3:

 import UIKit class ScrollViewWithButtons: UIScrollView { override init(frame: CGRect) { super.init(frame: frame) myInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) myInit() } private func myInit() { self.delaysContentTouches = false } override func touchesShouldCancel(in view: UIView) -> Bool { if view is UIButton { return true } return super.touchesShouldCancel(in: view) } } 

A continuación, puede utilizar este ScrollViewWithButtons en IB o en código.

Ninguna de las soluciones existentes funcionó para mí. Tal vez mi situación es más única.

Tengo muchos UIButtons dentro de UIScrollView . Cuando se pulsa un UIViewController se presenta un nuevo UIViewController al usuario. Si se presiona un botón y se mantiene presionado el tiempo suficiente, el botón mostrará su estado deprimido. Mi cliente se quejaba de que si toca demasiado rápido, no se muestra ningún estado deprimido.

Mi solución: dentro del método de toque de UIButtons , donde cargo el nuevo UIViewController y lo presento en la pantalla, uso

 [self performSelector:@selector(loadNextScreenWithOptions:) withObject:options afterDelay:0.] 

Esto progtwig la carga del próximo UIViewController en el siguiente ciclo de eventos. Permitir tiempo para que UIButton a dibujar. El UIButton ahora muestra su estado deprimido antes de cargar el siguiente UIViewController .

Swift 3:

 scrollView.delaysContentTouches = false