vivo ser playser online noticias madrid gratis española escuchar directo deportivo carrusel cadena iphone objective-c uikit uiviewcontroller uiscrollview

iphone - playser - radio cadena ser madrid



¿Por qué mi UIViewController no está en la cadena de respuesta para su vista? (3)

UIScrollView retrasará los toques de contenido de forma predeterminada; ¿Has mirado -delayTouch de contenido para asegurarte de que los toques pasarán?

He escrito una subclase de UIViewController que crea una vista mediante programación, en lugar de cargarla desde un archivo NIB.

Tiene un método loadView simple:

- (void)loadView { UIScrollView *mainScrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.view = mainScrollView; [mainScrollView release]; }

... luego hago la mayor parte de mi inicialización en viewDidLoad , como está documentado. Todo funciona, y puedo ver la vista de desplazamiento con mis vistas personalizadas.

Necesito un UIViewController para poseer la vista porque es parte de un flujo de trabajo UINavigationBar. Como tengo un objeto controlador, preferiría que fuera el controlador.

El problema, entonces, es que mi controlador de vista no parece estar en la cadena de respuesta. touchesBegan:withEvent: se invoca si lo defino en la vista raíz o en una subvista, pero no si está en el controlador de vista.

La documentación de Apple para el manejo de eventos menciona con ligereza que el controlador de vista debe estar en la cadena de respuesta . La documentación de UIViewController no dice nada acerca de los pasos adicionales necesarios más allá de la asignación de la vista raíz a la propiedad self.view , como he hecho anteriormente. La documentación de UIResponder afirma que UIView debería averiguar si tiene un controlador y pasarle el evento. La documentación de UIScrollView no dice nada en absoluto.

También experimenté con varias configuraciones de userInteractionEnabled: para todas las vistas y subvistas, sin suerte.

¿Qué me estoy perdiendo?


EricB, los toques se envían a la cadena de respuesta solo si no se han manejado. UIScrollView obviamente maneja todos los eventos táctiles, por lo que no envía nada a su próximoResponder. Tiene perfecto sentido para mí.

Lo que realmente quiere es "filtrar" eventos táctiles antes de que sean manejados por la lógica de desplazamiento de UIScrollView. Pero tenga en cuenta que la cadena de respuesta es una herramienta incorrecta para este trabajo, exactamente porque no permite interceptar los eventos antes de que se manejen.

Probablemente la mejor solución en su caso es subclase UIScrollView, anule los métodos táctiles (touchesBegan, etc.) y envíe manualmente los eventos al delegado antes de llamar a [super touchesXxx] .


Creo que el problema es que UIScrollView tiene una gran cantidad de errores y soluciones a los errores y errores en las soluciones a los errores :).

Es complicado por el hecho de que la subclasificación de UIScrollView suele ser una mala idea a largo plazo; a menudo tendrás que crear una subclase por otros motivos que no se pueden resolver de otra forma, por lo que si quieres volver a usar tu código, no intentes para subclasificar hasta que absolutamente tienes que hacerlo.

La solución más simple que he encontrado que funciona consistentemente es hacer que su contenido vea una pequeña subclase de UIView, teniendo en cuenta que UIScrollView SOLICITA que su vista de contenido no cambie nunca (por ejemplo, si habilita el zoom, Apple tiene algunos errores, al menos, iOS 6 que se activan cuando cambia la vista de contenido de una vista de desplazamiento existente), por lo que es una buena idea mantenerlo trivial y poner sus vistas personalizadas dentro de esta como subvistas.

NB: Esto siempre me ha funcionado en múltiples aplicaciones enviadas. Si hay un problema, aún no lo he visto. No tengo idea de por qué Apple no implementa estos simples cambios, a menos que haya un problema sutil con el que no me he encontrado todavía.

Uso:

/** Inside your UIViewController, wherever you set the root content view of your UIScrollView, you have to also tell the custom class "I am the nextResponder!" */ -(void)viewDidLoad { self.scrollView.contentSize = self.viewEmbeddedInScrollview.frame.size; self.viewEmbeddedInScrollview.nextResponderHeyAppleWhyDidYouStealThis = self; }

Archivo de interfaz + archivo de clase:

#import <UIKit/UIKit.h> @interface UIViewThatNeverLosesItsNextResponder : UIView @property(nonatomic,retain) UIResponder* nextResponderHeyAppleWhyDidYouStealThis; @end #import "UIViewThatNeverLosesItsNextResponder.h" @implementation UIViewThatNeverLosesItsNextResponder - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } @synthesize nextResponderHeyAppleWhyDidYouStealThis; -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [nextResponderHeyAppleWhyDidYouStealThis touchesBegan:touches withEvent:event]; } -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { [nextResponderHeyAppleWhyDidYouStealThis touchesCancelled:touches withEvent:event]; } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [nextResponderHeyAppleWhyDidYouStealThis touchesEnded:touches withEvent:event]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [nextResponderHeyAppleWhyDidYouStealThis touchesMoved:touches withEvent:event]; } @end