ScrollView no se desplaza al arrastrar botones

Tengo una vista de desplazamiento que solía desplazarse cuando no tenía botones por todas partes. Ahora sí, y al arrastrar el mouse (en el simulador) no pasa nada (creo que porque los botones están siendo empujados). ¿Cómo puedo hacer esto bien?

Esto está sucediendo porque las UIButton UIButton de UIScrollView (supongo que los botones se agregan como subvistas en su caso) están siguiendo los toques y no la vista de desplazamiento. UIScrollView método UIScrollView touchesShouldCancelInContentView es la clave aquí. Según su descripción: “El valor predeterminado devuelto es SÍ si la vista no es un objeto UIControl , de lo contrario, devuelve NO “, es decir, para los objetos UIControl (botones), UIScrollView no intenta cancelar toques, lo que impide el desplazamiento.

Entonces, para permitir el desplazamiento con botones:

  1. Asegúrese de que la propiedad UIScrollView canCancelContentTouches esté establecida en YES .
  2. La subclase UIScrollView y sobrescribe touchesShouldCancelInContentView para devolver YES cuando el objeto de vista de contenido es un UIButton , como este:
 - (BOOL)touchesShouldCancelInContentView:(UIView *)view { if ( [view isKindOfClass:[UIButton class]] ) { return YES; } return [super touchesShouldCancelInContentView:view]; } 

Fundé esta pregunta buscando la solución rápida para este problema, la “traduje” así:

 class UIButtonScrollView: UIScrollView { override func touchesShouldCancelInContentView(view: UIView!) -> Bool { if (view.isKindOfClass(UIButton)) { return true } return super.touchesShouldCancelInContentView(view) } } 

Espero que esto pueda ayudar

Solución Swift 3

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

Una cosa para probar si estás viendo esto en un simulador es correr en un teléfono real. No pude desplazarme en el simulador, pero no hay problema en mi teléfono.