2009-09-01 5 views
8

utilisant cette méthode pour masquer la barre d'état:iPhone OS: Touchez la barre d'état pour faire défiler vers le haut ne fonctionne pas après/retirons retour

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 

Lorsque « caché » retour à la NO, la tap- to-scroll-to-top (dans UIWebView, UITableView, peu importe) ne fonctionne plus, et nécessite un redémarrage de l'application pour récupérer la fonctionnalité.

Est-ce un bug (j'ai de toute façon déposé un rdar) ou ai-je manqué une étape? Devrais-je m'attendre à ce comportement puisque le statusBar "perd le contact" en quelque sorte avec la vue respective?

Répondre

18

Vous pouvez essayer de définir la propriété ScrollsToTop true encore après re-montrer:

[currentView setScrollsToTop:YES]; 

Si ce ne fonctionne pas, vous certainement montrant qu'une seule vue? S'il y a plus d'une vue défilante, un message scrollViewDidScrollToTop est ignoré ...

+0

Très bonne observation. Il est probablement confondu avec plusieurs vues. Je dois voir si je peux trouver une solution de contournement. – avocade

+0

Le problème est que c'est un UIWebView qui a besoin de récupérer le comportement scroll-to-top - et ce n'est pas une sous-classe UIScrollView directe ... donc setScrollsToTop: ne fonctionne pas du tout. Il a probablement un scrollView quelque part dans sa structure UIWebViewInternal, mais cela semble être _very_ opaque. [webView valueForKey: @ "_ scrollView"] n'a pas fonctionné du tout pour l'obtenir directement. Tout autre nom devine? :) – avocade

+0

Vous pouvez ajouter UIWebView en tant que sous-vue d'un UIScrollView (dans mon implémentation, il s'agit d'une sous-vue d'un UITableView). Si c'est la seule vue à l'intérieur de UIScrollView, alors l'appel de -setScrollsToTop sur UIScrollView devrait le faire fonctionner sur l'UIWebView ... – h4xxr

0

Je viens de rencontrer un comportement similaire dans l'application sur laquelle je travaille actuellement. Dans son cas, si vous chargez une vidéo YouTube depuis un UIWebView, faites défiler vers le haut pour ne plus travailler pour le reste du cycle de vie de l'application. Je suppose que cela pourrait arriver après avoir chargé le lecteur de film, mais je n'ai pas confirmé. Cette fonctionnalité a été beaucoup plus longue et a probablement moins de bugs.

5

Vous pouvez utiliser le code suivant pour avoir la UIWebView ignorer scrollToTop sans UIScrollView supplémentaire:

((UIScrollView *)[[webView valueForKey:@"_internal"] valueForKey:@"scroller"]).scrollsToTop = NO; 
+4

Comme cela utilise un appel API privé, votre application sera probablement rejetée. Vous pouvez être en mesure de s'en tirer avec '((UIScrollView *) [[subviews webView] objectAtIndex: 0]). ScrollsToTop = NO;' –

+0

Merci Alex! Beaucoup plus élégant et sûr à coup sûr. –

+0

Cela fonctionne pour moi. Excellente solution, merci! – Jasarien

3

J'ai eu un problème similaire après avoir joué une vidéo Youtube dans mon application. scrollsToTop était toujours défini sur YES mais le fait d'appuyer sur la barre d'état n'avait aucun effet. J'ai enfin réalisé que ma fenêtre d'application n'était plus la fenêtre clé. Après avoir ajouté la ligne suivante à une sous-classe UIWindow (que j'avais déjà pour d'autres raisons) tout fonctionnait comme il se doit à nouveau:

if (![self isKeyWindow]) [self makeKeyWindow]; 
5

J'avais un problème similaire où la fonctionnalité de défilement à haut a été perdu. Il s'avère que cela ne fonctionnera que si vous avez une seule vue active à la fois (dans la même vue de défilement). Dans mon cas, j'avais une vue sur la table et une autre vue qui se fanait dans/hors. L'ajout d'un removeFromSuperview à la fin de l'animation a fait l'affaire.

La réponse était dans les commentaires de fichier UIScrollView.h:

/* 
this is for the scroll to top gesture. by default, a single scroll visible scroll view with this flag set will get the call. if there is more than one visible with this 
flag set or the delegeat method returns NO, the view isn't scrolled 
*/ 
@property(nonatomic) BOOL scrollsToTop;   // default is YES. if set, special gesture will scroll to top of view after consulting delegate 
7

Le correctif suivant par Alex a travaillé pour moi. Merci!

((UIScrollView *)[[webView subviews] objectAtIndex:0]).scrollsToTop = NO; 

Être pressé ce correctif fonctionnait très bien, cependant donné plus de temps je pourrais ai UIWebView et sous-classé accédé au membre UIScrollView protégé directement. Le souci que j'ai avec la méthode d'Alex est de supposer que UIScrollView est à l'index zéro des sous-vues (l'encapsulation permet aux membres privés de changer). Ce qui suggère encore une autre solution:

for (UIView* v in [webView subviews]) 
{ 
    if ([v isKindOfClass:[UIScrollView class]]) 
    { 
     (UIScrollView *)v.scrollsToTop = NO; 
    } 
} 
10

Dans iOS 5.0 vous pouvez accéder à la propriété scrollview du UIWebView

webView.scrollView.scrollsToTop = YES; 
0

Je veux ajouter mon cas, j'ajouter un UIWebView sur un UIScrollView, comme h4xxr avait répondu sur le dessus:

S'il y a plus d'un point de vue de défilement d'un scrollViewDidScrollToTop message est ignoré

Donc, j'ai un moyen simple de le faire fonctionner sur webView: il suffit de définir la propriété scrollsToTop de scrollView.

Et lorsque vous tapez sur la barre d'état, elle n'est pas interceptée par le scrollView, et le webView défile vers le haut!

UIScrollView *scrollView = [[UIScrollView alloc] init]; 
    scrollView.frame = self.view.bounds; 
    scrollView.scrollsToTop = false; //igore scrollView`s scrollsToTop 
    [self.view addSubview:scrollView]; 

    UIWebView *webView = [[UIWebView alloc] init]; 
    webView.frame = scrollView.bounds; 
    [scrollView addSubview:webView]; 
Questions connexes