UIScrollview delaysContentTouches issue

Tengo UIScrollView cargado con UIButtons y en la acción de UIButton UIImage de cada UIButton .

Si no establezco delaysContentTouches como NO , resaltado UIImage of UIButton no se mostrará si toco UIButton muy rápido. Después de establecer la propiedad delaysContentTouches como NO , solo se muestra el UIButton resaltado UIImage .

Ahora después de establecer la propiedad delaysContentTouches como NO para UIScrollView . No puedo desplazar mi UIScrollView arrastrando los UIButtons . Ahora, ¿cómo puedo resolver este problema?

Por favor, dame un consejo.

Gracias por adelantado.

Esto es lo que funciona para mí. Subclass UIScrollView e implementa solo este método:

 - (BOOL)touchesShouldCancelInContentView:(UIView *)view { return YES; } 

Luego, establezca delaysContentTouches = NO;

Voila! Funciona igual que la pantalla de inicio: destaca los botones de inmediato, pero aún permite desplazarse 🙂

Descubrí que en iOS 8, el UIPanGestureRecognizer subyacente de UIScrollView no respeta la propiedad delaysContentTouches de UIScrollViewView. Considero que es un error de iOS 8. Aquí está mi solución:

 theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches 

OK, he resuelto implementando el siguiente método:

 - (BOOL)touchesShouldCancelInContentView:(UIView *)view { NSLog(@"touchesShouldCancelInContentView"); if ([view isKindOfClass:[UIButton class]]) return NO; else return YES; } 

No se puede encontrar una solución satisfactoria en línea hasta el momento (y parece ser que Apple está ignorando el problema). Encontré un hilo en el foro de desarrolladores de Apple con algunas sugerencias que pueden ayudar: UIScrollView: 'delaysContentTouches' ignorado

Pude utilizar la solución desde este enlace. Para resumir la solución (estoy parando aquí):

Los objects UIEvent contienen una timestamp.

Puede registrar la timestamp en el momento de tocarBegan en su subvista incrustada .

Al tocar la subvista Movida de scrollView, mire la timestamp y la location nuevamente.

Si el tacto no se ha movido muy lejos y ha pasado más de, digamos, 0.1 segundos, puede asumir que el usuario tocó la subvista y luego retrasó el movimiento.

En este caso, UIScrollView decidirá, independientemente, que esto NO es una acción de desplazamiento, aunque nunca lo dirá.

Entonces, puede tener una variable de estado local para indicar que se produjo esta condición de movimiento retardado y procesar los events recibidos por la subvista.

Aquí está mi código:

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // store the timestamp _beginDragTimeStamp = event.timestamp; // your embedded subview's touches begin code } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ // compare and ignore drag if time passed between tap and drag is less than 0.5s if(event.timestamp - _beginDragTimeStamp < 0.5) return; // your drag code } 

Tuve el mismo problema y la misma jerarquía de las vistas, con el último SDK, simplemente utilízalo:

Configurando delaysContentTouches en NO para UIButton en la misma UITableViewCell.

 self.scrollview.delaysContentTouches = NO