2011-12-17 23 views
6

Ho due controller di vista. Una scrollview per il controllo della pagina e una per i dettagli (scorrimento verticale).scrollToTop non funziona su iPhone ma funziona su iPad

Quando faccio clic su barra di stato su iPhone, scrollToTop non funziona e in iPad funziona scrollToTop.

Sono sicuro che scrollView.scrollToTop è SÌ. perché lo stampo già

Qualcuno sa che causa l'iPhone scrollToTop non funziona?

Grazie

Edit: provo chiamando il delegato ScrollView. in iPad questo delegato è chiamato. - (BOOL) scrollViewShouldScrollToTop: (UIScrollView *) scrollView

in iPhone non viene chiamato. Uso già entrambi i contenuti ScrollView.delegate = self; ma l'iPhone non funziona :(

Edit: Prova sottoclasse UIWindow (non funzionante)

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; 

risposta

3

Da quello che si capisce 2 UIScrollViews contemporaneamente sullo schermo.

Da quello che ho visto & esperto, Su iOS 4 con 2 UIScrollViews fianco a fianco fornisce un comportamento indefinito. Una delle scrollview può scorrere, altre volte, a volte nessuna delle due.

Su iOS 5 se si dispone di 2 UIScrollViews fianco a fianco poi toccando barra di stato "scorre in cima alla pagina" il diritto UIScrollView "sotto il rubinetto"

Non so come funziona, ma questo è stato la mia osservazione iOS 5 è intelligente !!

Se le tue UIScrollViews sono una sopra l'altra, probabilmente il comportamento non è definito. Non ho controllato

Spero che questo aiuti.

Se si vuole farlo funzionare comunque allora ecco una possibile soluzione.

sottoclasse o aggiungere una categoria a UIWindow e aggiungere un sistema di riconoscimento gesto/o implementare hitTest che rileva rubinetto solo per Y < 20 e così via e poi lo hanno inviare una notifica e ascoltare questo nella vostra viewController e programmaticamente scorrere l'UIScrollView in alto.

EDIT

implementare questo nella sottoclasse 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

nel mio iPhone ios 5 non funziona anche. in ipad funzionano entrambe le versioni 4.3 e 5. come posso aggiungere una categoria su UIWindow e aggiungere il riconoscimento dei gesti? –

+0

Ho aggiunto il codice per inserire sottoclasse UIWindow – NSIntegerMax

+0

Ho modificato la mia domanda con sottoclasse uiwindow. È corretto? se il codice è corretto, il nslog non viene stampato. –

1

Nel caso in cui si dispone di più di una UIScrollView grado (comprese le sottoclassi ad esempio UITableView ecc) sullo stesso schermo è necessario definire quale deve agire sull'evento scrollToTop. Ciò significa che è necessario passare attraverso tali istanze e impostare la proprietà scrollToTop su NO tranne per quella che si desidera fare. Per me ha funzionato sempre. In caso contrario, è stato a causa di altri UIScrollView che non sapevo che fosse lì. In quel caso ho appena attraversato tutte le subviews disabilitando ricorsivamente la proprietà thet e poi ha iniziato a funzionare come previsto. Saluti. :)

0

Ecco la mia soluzione basata sulla risposta di NSIntegerMax. In questo modo non dobbiamo preoccuparci dell'orientamento o avere valori codificati.

dichiarare questa 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)) 

e implementare il metodo:

- (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

Non so quello che Apple erano fumatori, ma in base alla progettazione, il comportamento su iPhone è nettamente diverso da iPad. Apple's documentation include una nota "Special Condsideration" come segue ...

Su iPhone, il gesto di scorrimento-to-top non ha effetto se non v'è più di un vista di scorrimento sullo schermo che ha scrollsToTop impostato su SÌ.

Così su iPhone è necessario assicurarsi che ci sia sempre e solo un'UIScrollView (o UITableView/UICollectionView/UIWebView ecc) che ha la sua scrollsToTop = YES.

Poiché scrollToTop è impostato su SÌ, è necessario impostare in modo esplicito scrollsToTop = NO per l'UIScrollView che non si desidera scorrere quando l'utente tocca la barra di stato.

Problemi correlati