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?
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:
- Asegúrese de que la propiedad
UIScrollView
canCancelContentTouches
esté establecida enYES
. - Subclase
UIScrollView
y overridetouchesShouldCancelInContentView
para devolverYES
cuando el objeto content view es unUIButton
, así:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
if ( [view isKindOfClass:[UIButton class]] ) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
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
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)
}
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.
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