iphone ios cocoa-touch uiscrollview uibutton

iphone - UIButton detrás de UIScrollView



ios cocoa-touch (7)

Quizás un mejor enfoque sea poner una subclase UIView (en lugar de un UIButton) como subvista en UIScrollView y agregar un UITAPGestureRecognizer en ellas.

Tengo un UIButton detrás de UIScrollView. El fondo del desplazamiento es transparente y el botón está en la esquina inferior derecha. Entonces es visible.

El problema es que UIButton no responde a ningún evento táctil cuando está debajo del desplazamiento. ¿Qué se necesitaría para que responda a los eventos táctiles en este escenario?

Gracias


Si UIButton está detrás de UIScrollView , entonces no puede responder a toques porque hay un UIScrollView en el camino. Coloque el UIButton en UIScrollView o UIButton el UIScrollView para que ya no obstruya el botón.


En realidad, puedes hacer esto, lo he hecho en Mac, tenía que ver con pasar los eventos. Busque en línea, debería poder encontrar algunos punteros. Recuerdo que me tomó un tiempo resolverlo hace un tiempo.


Puedes probar esto. U necesita agregar el botón a la subvista después de agregar su vista de desplazamiento.

....

[myView addSubview: myScrollView];

.....

[myView addSubview: myButton];

Si lo haces en IB, solo tienes que arrastrar el botón debajo de la vista de desplazamiento ...


Debe usar el método + touchesBegan para pasar los toques al siguiente objeto.
Aquí hay un ejemplo de cómo harías esto:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { printf("MyButton touch Began/n"); [self.nextResponder touchesBegan:touches withEvent:event]; }

Aquí hay más información sobre la cadena de respuesta:

  1. Un poco sobre la cadena de respuesta (http://iphonedevelopment.blogspot.com)

  2. Competencias de la aplicación Cocoa para iOS: Objeto Responder (http://developer.apple.com)


Para los novatos como yo que vienen a buscar ayuda, así es como lo haces en Storyboard: arrastra el botón al mismo nivel que scrollView y asegúrate de que el botón esté A CONTINUACIÓN de scrollView: ¡el orden importa! Cuanto menor es la posición, la parte superior de la capa de vista es


Tuve este problema hoy, después de mucho tiempo de investigación es bastante difícil de lograr, ya que puede perder la capacidad de arrastre a cambio del evento de clic de botones.

Sin embargo: terminé con esto, una subclase UIScrollView, que recibe el botón o los botones que le interesan para captar el evento.

La clave es usar [(UIControl *) ver sendActionsForControlEvents: UIControlEventTouchUpInside]; , porque llamar al método touchesBegan no siempre funciona como se esperaba. Esto no cambiará la GUI al presionar el botón, pero puede implementarlo según sea necesario en un método personalizado.

@implementation ForwardScrollView @synthesize responders = _responders; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code _touchesEnabled = YES; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { if ( self = [super initWithCoder: aDecoder]) { _touchesEnabled = YES; } return self; } - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return _touchesEnabled; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { _touchesEnabled = NO; UIWindow *window = [UIApplication sharedApplication].delegate.window; for(UITouch *touch in touches) { CGPoint point = [touch locationInView:self]; point = [window convertPoint:point fromView:self]; UIView *view = [window hitTest:point withEvent:event]; UITouch* touch = [touches anyObject]; UIGestureRecognizer* recognizer; if ([touch gestureRecognizers].count > 0) { recognizer = [touch gestureRecognizers][0]; } if ( (!recognizer || ![recognizer isMemberOfClass:NSClassFromString(@"UIScrollViewPanGestureRecognizer")]) && [_responders containsObject: view]) { [(UIControl*)view sendActionsForControlEvents: UIControlEventTouchUpInside]; } } _touchesEnabled = YES; } @end

El conteo de los gestureRecognizers es evitar el gesto de panorámica que podría disparar el botón cuando no se realiza un toque real.