2010-04-23 3 views
6

Mon application a un UITableView. Cette UITableView a une vue d'en-tête, qui est un UIWebView. Par défaut, la propriété scrollsToTop des propriétés de défilement est définie sur YES, ce qui permet à l'utilisateur d'appuyer sur la barre d'état pour accéder au haut de la vue défilée.UITableView, UIWebViews et la propriété scrollsToTop = Problème

Lorsque deux vues de défilement sont intégrées dans une vue, toutes deux ont leur propriété scrollsToTop définie sur YES, en appuyant sur la barre d'état ne fait rien. La solution consiste à définir l'une des propriétés scrollsToTop sur NO. Cela réactive l'activation de la barre d'état.

Voici maintenant le problème: UIWebView n'expose pas la vue de défilement, et par conséquent, il n'y a pas d'accès à sa propriété scrollsToTop. Je veux seulement que la vue de table défile vers le haut quand la barre d'état est tapée, pas la vue de Web.

Est-ce que quelqu'un sait comment je peux y parvenir?

Répondre

3

Il y a maintenant une propriété ScrollView, qui est préférée:

myWebView.scrollView.scrollsToTop = YES; 
0

Avez-vous essayé la méthode de délégation à partir de UIScrollViewDelegate scrollViewShouldScrollToTop?

+0

Cela ne semble pas fonctionner. J'ai d'abord essayé d'implémenter cette méthode en même temps que les méthodes UIWebViewDelegate, mais je ne pensais pas que cela fonctionnerait car la vue Web elle-même est le délégué de la vue déroulante, plutôt que le délégué de la vue Web. Alors j'ai sous-classé UIWebView et mis en œuvre, mais toujours pas de chance. Cela ne semble pas fonctionner. – Jasarien

+0

Enquête supplémentaire: Il semble que UIWebView lui-même ne répond pas aux méthodes de délégué de la vue déroulante. Peut-être un autre objet interne est le délégué de la vue déroulante? – Jasarien

3

Cette question contient la réponse:

iPhone OS: Tap status bar to scroll to top doesn't work after remove/add back

Je ne pouvais pas trouver auparavant car il a été demandé différemment et sur un sujet un peu différent, mais le résultat est le même. Le résultat a donc été de parcourir les sous-vues jusqu'à ce que vous trouviez la vue déroulante. Je l'ai déjà fait dans d'autres applications et je n'y ai pas pensé dans ce cas. Il devrait être App-Store-Safe, car j'ai des applications sur le magasin qui utilisent cette idée.

Une catégorie sur UIWebView pour activer ou désactiver le défilement vers le haut:

@implementation UIWebView (UIWebViewScrollToTopAdditions) 

- (void)setScrollsToTop:(BOOL)scrollsToTop 
{ 
    if ([[self subviews] count] > 0) 
    { 
     UIScrollView *scrollView = (UIScrollView *)[[self subviews] objectAtIndex:0]; 
     if ([scrollView respondsToSelector:@selector(setScrollsToTop:)]) 
     { 
      [scrollView setScrollsToTop:scrollsToTop]; 
     } 
    } 
} 

@end 
2

Cela arrive souvent parce que tous les scrollviews ont une valeur par défaut . Lorsque de nouveaux scrollviews ou webviews sont créés, scrollsToTop est défini sur YES. J'ai écrit une catégorie simple pour cette question spécifique:

-[UIScrollView makeOnlyThisScrollViewScrollToTopOnStatusBarTap]; 

https://gist.github.com/hfossli/6776203

Il définit essentiellement scrollsToTop à NO sur tous les autres scrollViews que celui que vous spécifiez + en prenant soin de la valeur par défaut. Bonne chance!

+1

C'était la seule chose qui a fonctionné pour moi. Devrait avoir plus de votes à mon avis. Merci pour cela. –

+1

Cela fonctionne parfaitement! – Legnus