2010-06-01 4 views
21

J'ai UIScrollView avec plusieurs sous-vues UIVIew. Je voudrais mettre à jour les données qui sont affichées par chaque UIView lorsqu'ils apparaissent dans la partie visible de l'UIScrollView.viewWillAppear pour les sous-vues

Quel est le rappel qui est déclenché? J'ai essayé viewWillAppear, mais il ne semble pas être appelé.

Merci. :)

Répondre

83

Vous devez faire le calcul vous-même. Mettre en œuvre scrollViewDidScroll: dans votre délégué de vue de défilement et calculer manuellement les vues sont visibles (par exemple en vérifiant si CGRectIntersectsRect(scrollView.bounds, subview.frame) renvoie true

+0

Bon, pour une raison que j'avais l'impression qu'il y avait un construit en rappel. Merci. – nan

+0

Fonctionne comme un charme, merci! – jhilgert00

+0

De ce que je peux rassembler viewWillAppear: et ses parents sont seulement appelés la première fois que la vue est ajoutée à une hiérarchie de vue. Même si viewWillAppear: de la vue d'ensemble est invoqué, ceux de toutes les sous-vues déjà dans sa hiérarchie ne le seront pas. Donc, pour ce cas simple, vous devez indiquer à vos sous-vues de se rafraîchir, quelle que soit la vue racine qui reçoit ce message. –

3

Un léger raffinement je voulais connaître le montant de la vue qui a été affiché dans la scrollview:..

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 
{ 
    // Figure out how much of the self.userFeedbackView is displayed. 
    CGRect frame = CGRectIntersection(self.scrollView.bounds, self.userFeedbackView.frame); 
    CGFloat proportion = (frame.size.height*frame.size.width)/(self.userFeedbackView.frameWidth*self.userFeedbackView.frameHeight); 
    NSLog(@"%f; %@", proportion, NSStringFromCGRect(frame)); 
} 
5

réponses ci-dessus sont corrects si votre scrollview est pas dans le zoomé dans l'état. en cas si votre scrollview peut zoomer calcul ci-dessus ne fonctionne pas comme vous devez considérer un zoom trop

voici le code

CGRect visibleRect; 
       visibleRect.origin = self.mapScrollView.contentOffset; 
       visibleRect.size = self.mapScrollView.bounds.size; 

       float theScale = 1.0/self.mapScrollView.zoomScale; 
       visibleRect.origin.x *= theScale; 
       visibleRect.origin.y *= theScale; 
       visibleRect.size.width *= theScale; 
       visibleRect.size.height *= theScale; 
       if(CGRectIntersectsRect(visibleRect, btnPin.frame)){ 
         ... 
       } 
+0

C'est génial! Je n'aurais pas compris celui-là – csduarte

5

Swift 3 solution

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    let viewFrame = greenView.frame 

    let container = CGRect(x: scrollView.contentOffset.x, y: scrollView.contentOffset.y, width: scrollView.frame.size.width, height: scrollView.frame.size.height) 


    // We may have received messages while this tableview is offscreen 
    if (viewFrame.intersects(container)) { 
     // Do work here 
     print("view is visible") 
    } 
    else{ 
     print("nope view is not on the screen") 
    } 
} 
Questions connexes