ScrollView no se desplaza al arrastrar los botones


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

Author: Juan Boero, 2010-08-18

4 answers

Esto sucede porque UIButton subviews de la UIScrollView (supongo que los botones se añaden como subviews en su caso) están siguiendo los toques y no la vista de desplazamiento. UIScrollView el método touchesShouldCancelInContentView es la clave aquí. Según su descripción: "El valor devuelto por defecto es YES si view no es un objeto UIControl; de lo contrario, devuelve NO.", es decir, para UIControl objetos (botones), UIScrollView no intenta cancelar toques que impiden el desplazamiento.

Entonces, para permitir el desplazamiento con botones:

  1. Asegúrese de que la propiedad UIScrollView canCancelContentTouches esté establecida en YES.
  2. Subclase UIScrollView y override touchesShouldCancelInContentView para devolver YES cuando el objeto content view es un UIButton, así:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    if ( [view isKindOfClass:[UIButton class]] ) {
        return YES;
    }

    return [super touchesShouldCancelInContentView:view];
}
 95
Author: Roman Kishchenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-29 17:37:27

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

 9
Author: pugia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-10 05:58:21

Solución Swift 3

override func touchesShouldCancel(in view: UIView) -> Bool {
    if view is UIButton {
        return true
    }
    return super.touchesShouldCancel(in: view)
}
 5
Author: Gregg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-07 18:06:58

Una cosa a probar si estás viendo esto en un simulador es ejecutar en un teléfono real. No pude desplazarme en el simulador, pero no prob en mi teléfono.

 0
Author: William T. Mallard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-11 23:12:55