2011-12-17 11 views
6

Tengo dos controles de vista. Una vista de desplazamiento para control de página y otra para detalles (desplazamiento vertical).scrollToTop no funciona en el iPhone pero funciona en el iPad

Cuando hago clic en la barra de estado en el iPhone, el scrollToTop no funciona, y en el iPad el scrollToTop está funcionando.

Estoy seguro de que scrollView.scrollToTop es SÍ. porque ya lo imprimo

¿Alguien sabe qué causa que el iPhone scrollToTop no funcione?

Gracias

Editar: Trato llamando el delegado ScrollView. en iPad este delegado se llama. - (BOOL) scrollViewShouldScrollToTop: (UIScrollView *) scrollView

en iPhone no se llama. Ya uso ambos contentScrollView.delegate = self; pero el iPhone no funciona :(

Editar: Trate de subclases UIWindow (no funciona)

Window.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 
@interface Window : UIWindow 
@end 

Window.m

#import "Window.h" 

@implementation Window 

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
if ([event type] == UIEventTypeTouches && point.y < 250) { 
    //Send Your Notification Here 
    NSLog(@"KAROOO"); 
} 
NSLog(@"HELLOWW"); 
return [super hitTest:point withEvent:event]; 
} 
@end 

AppDelegate.h

@property (nonatomic, strong) IBOutlet Window *window; 

AppDelegate.m

@synthesize window = _window; 

Respuesta

3

Por lo que entiendo que tiene 2 UIScrollViews simultáneamente en pantalla.

Por lo que he visto & experimentado, En iOS 4 teniendo 2 UIScrollViews uno al lado del otro da un comportamiento indefinido. Una de las vistas de desplazamiento puede desplazarse, a veces otras, a veces tampoco.

En iOS 5 si tiene 2 UIScrollViews al lado del otro a continuación, tocando en la barra de estado "se desplaza hacia arriba" la derecha UIScrollView "bajo el grifo"

No sé cómo funciona esto, pero esto ha sido mi observación ¡iOS 5 es inteligente!

Si sus UIScrollViews están uno encima del otro, entonces probablemente el comportamiento no está definido. No lo he comprobado

Espero que esto ayude.

Si desea que funcione de todos modos, aquí hay una posible solución.

Subclase o Agregar una categoría en UIWindow y añadir un reconocedor gesto/o implementar hitTest que detecta grifo únicamente para Y < 20 y etc. entonces tienen que enviar una notificación y escucha esto en su viewController y programáticamente desplazarse UIScrollView hacia arriba.

EDITAR

implementar esto en la subclase UIWindow (IPAD)

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    if ([event type] == UIEventTypeTouches && point.y < 20 && [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait) { 
     NSLog(@"Portrait"); 
    } else if ([event type] == UIEventTypeTouches && point.y > 1004 && [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown) { 
     NSLog(@"PortraitUpsideDown"); 
    } else if ([event type] == UIEventTypeTouches && point.x < 20 && [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft) { 
     NSLog(@"LandscapeLeft"); 
    } else if ([event type] == UIEventTypeTouches && point.x > 748 && [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) { 
     NSLog(@"LandscapeRight"); 
    } 
    return [super hitTest:point withEvent:event]; 
} 
+0

en mi iPhone ios 5 no funciona también. en el iPad, tanto 4.3 como 5 están funcionando. ¿Cómo puedo agregar una categoría en UIWindow y agregar el reconocedor de gestos? –

+0

Agregué el código para poner en la subclase UIWindow – NSIntegerMax

+0

He editado mi pregunta con la subclase uiwindow. ¿Es eso correcto? si el código es correcto, el nslog no se imprime. –

1

En caso de que tenga más de un UIScrollView instancia (incluyendo subclases, por ejemplo, UITableView etc) en la misma pantalla que necesita definir cuál debería actuar en el evento scrollToTop. Esto significa que debe pasar por esas instancias y establecer su propiedad scrollToTop en NO, excepto en la que desee. Para mí funcionó siempre. En caso de que no fuera así, fue por algún otro UIScrollView que no sabía que estaba allí. En ese caso, pasé por todas las subvistas deshabilitando recursivamente su propiedad y luego comenzó a funcionar como se esperaba. Saludos. :)

0

Aquí está mi solución basada en la respuesta de NSIntegerMax. De esta manera, no tenemos que preocuparnos por la orientación o tener valores codificados.

declarar esta macro

#define isInStatusBar(frame, point) (point.x >= frame.origin.x && point.x <= (frame.origin.x+frame.size.width) && point.y >= frame.origin.y && point.y <= (frame.origin.y+frame.size.height)) 

y poner en práctica el método:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    CGRect frame = [[UIApplication sharedApplication] statusBarFrame]; 

    if ([event type] == UIEventTypeTouches && isInStatusBar(frame, point)) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationAppDidTouchStatusBar object:nil]; 
    } 

    return [super hitTest:point withEvent:event]; 
} 
1

No sabe lo que Apple eran fumadores, pero por el diseño, el comportamiento en el iPhone es claramente diferente de IPAD. Apple's documentation sí incluye una nota "Condsideration especial" de la siguiente manera ...

En el iPhone, el gesto-scroll-arriba no tiene ningún efecto si hay más de una vista de desplazamiento en la pantalla que tiene scrollsToTop establece en SÍ.

Así que el iPhone usted tiene que asegurarse de que hay solo uno UIScrollView (o UITableView/UICollectionView/UIWebView etc) que tiene su scrollsToTop = YES.

Dado que scrollsToTop tiene como valor predeterminado SÍ, debe establecer explícitamente scrollsToTop = NO para UIScrollView que no desea desplazarse cuando el usuario toca la barra de estado.

Cuestiones relacionadas