iphone - plus - UIScrollView evita los toques. Empieza, toca, mueve, toca. Se enciende en el controlador de vista.
sensibilidad pantalla iphone 6 plus (5)
"Estaba funcionando bien. Luego agregué una vista de desplazamiento (UIScrollView) como la vista superior en la jerarquía".
¿Está su vista de desplazamiento en la parte superior de su vista de contenido que contiene elementos?
todos los componentes deben estar en la vista de desplazamiento y no la vista detrás de la vista de desplazamiento
Estoy manejando toques para un par de mis componentes de UI en mi controlador de vista (subclase personalizada de UIViewController). Tiene los métodos touchesBegan:withEvent:
touchesMoved:withEvent:
y touchesEnded:withEvent:
Estaba funcionando bien. Luego agregué una vista de desplazamiento (UIScrollView) como la vista superior en la jerarquía.
Ahora mis controladores táctiles en el controlador de vista no funcionan. Ellos no son llamados. Lo interesante es que tengo varios otros componentes de UI dentro de la vista de desplazamiento que funcionan. Algunos son botones, otros son vistas personalizadas que definen sus propios touchesBegan:withEvent:
etc. Lo único que no funciona son los controladores de toque en el controlador de vista.
Pensé que tal vez se debía a que la vista de desplazamiento está interceptando esos toques para sus propios fines, pero asigné una subclase de UIScrollView y solo para ver si podía hacer que funcionara, estoy touchesShouldBegin:withEvent:inContentView:
siempre de touchesShouldCancelInContentView:
. Todavía no funciona.
Si hace una diferencia, mi controlador de vista está dentro de un controlador de barra de pestañas, pero no creo que sea relevante.
¿Alguien ha tenido este problema y tiene una solución lista? Mi conjetura es que la vista de desplazamiento simula la cadena de respuesta. ¿Puedo repetirlo? Supongo que si no puedo resolver nada más, haré que la vista de nivel superior bajo mi vista de desplazamiento sea una vista personalizada y reenvíe los mensajes al controlador de vista, pero parece un poco confuso.
Bueno, esto funcionó, pero no estoy seguro de que pueda "salirme con la suya", ya que nextResponder no es uno de los métodos UIView que se "anima" a anular en una subclase.
@interface ResponderRedirectingView : UIView {
IBOutlet UIResponder *newNextResponder;
}
@property (nonatomic, assign) IBOutlet UIResponder *newNextResponder;
@end
@implementation ResponderRedirectingView
@synthesize newNextResponder;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (UIResponder *)nextResponder {
return self.newNextResponder;
}
- (void)dealloc
{
[super dealloc];
}
@end
Luego, en Interface Builder, realicé la subvista directa de la vista de desplazamiento una de éstas, y conecté su nuevoNextResponder para omitir la vista de desplazamiento y apuntar directamente al controlador de vista.
Esto también funciona, reemplazando la anulación de nextResponder con estas anulaciones:
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.newNextResponder touchesBegan:touches withEvent:event];
}
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[self.newNextResponder touchesMoved:touches withEvent:event];
}
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self.newNextResponder touchesEnded:touches withEvent:event];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[self.newNextResponder touchesCancelled:touches withEvent:event];
}
La respuesta de user1085093 funcionó para mí. Sin embargo, una vez que mueves el toque más de una pequeña cantidad, se interpreta como un gesto de panorámica.
Superé esto al alterar el comportamiento del reconocedor Pan Gesture por lo que requiere dos dedos:
-(void)awakeFromNib
{
NSArray *gestureRecognizers = self.gestureRecognizers;
UIGestureRecognizer *gestureRecognizer;
for (gestureRecognizer in gestureRecognizers) {
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
UIPanGestureRecognizer *pgRecognizer = (UIPanGestureRecognizer*)gestureRecognizer;
pgRecognizer.minimumNumberOfTouches = 2;
}
}
}
Los métodos touchesBegan:
etc NUNCA serán llamados en un UIScrollView
porque es una subclase de UIView
y reemplaza estos métodos. Echa un vistazo a los diferentes métodos UIScrollView
disponibles here . La solución temporal dependerá de lo que desee implementar.
crear una subclase de la clase UIScrollView y anular el touchesBegan: y otros métodos táctiles de la siguiente manera:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
// If not dragging, send event to next responder
if (!self.dragging){
[self.nextResponder touchesBegan: touches withEvent:event];
}
else{
[super touchesBegan: touches withEvent: event];
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
// If not dragging, send event to next responder
if (!self.dragging){
[self.nextResponder touchesMoved: touches withEvent:event];
}
else{
[super touchesMoved: touches withEvent: event];
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// If not dragging, send event to next responder
if (!self.dragging){
[self.nextResponder touchesEnded: touches withEvent:event];
}
else{
[super touchesEnded: touches withEvent: event];
}
}