2012-06-06 2 views
1

I Vous souhaitez implémenter une vue de défilement qui contient plusieurs UIViews. L'objet le plus à gauche doit être plus grand que le reste des éléments. Donc, mon problème est le suivant. Chaque fois qu'un élément quitte l'écran vers la gauche (son origine.x est inférieur à 15), je dois redimensionner l'élément de 470x440 à 235x220 pixels. C'est assez simple à mettre en œuvre. Le problème est que l'élément qui est déplacé vers la gauche du pixel 480 doit être agrandi de 235x220 pixels à 470x440 pixels ET il doit être déplacé vers la gauche de 235 pixels (de manière à ne pas couvrir l'élément à sa droite, mais plutôt de se déplacer dans l'espace laissé par l'élément laissant quand il "rétréci"UIScrollView avec sous-zoom Zoom

J'ai essayé quelques approches différentes à cela, mais je ne peux pas l'animation à l'air bien, et il y a un tas de problèmes ici et

Est-ce que quelqu'un a une idée de la façon dont je pourrais mettre en œuvre ce type de fonctionnalité? Notez que je ne veux pas zoomer, mais je veux redimensionner les éléments dans la vue de défilement de telle sorte que la plupart des éléments (visibles à l'écran) sont deux fois plus grands que les autres éléments

+1

Commander [Advanced Scrolling Techniques - WWDC2011] (https://developer.apple.com/videos/wwdc/2011/?id=104). Vous devriez trouver votre réponse là-bas - à la fin de la vidéo, mais cela vaut la peine de regarder si dès le début (vous aurez besoin de vous connecter avec l'identifiant du développeur). –

+0

Merci pour ce lien rokjarc! Il parle de zoom, mais je ne suis pas en train de zoomer sur tout le contenu de la vue défilement, mais plutôt de redimensionner certains éléments dans la vue défilement. Mais la vidéo m'a donné de jolis conseils sur le point de départ :) –

Répondre

3

Au cas où quelqu'un d'autre pourrait être intéressé, j'ai fini avec ce qui suit à l'intérieur scrollViewDidScroll:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {   
    float contentOffset = scrollView.contentOffset.x; 
    int leavingElementIndex = [_scrollView indexOfElementLeavingScene:scrollView.contentOffset.x]; 
    int entereingElementIndex = leavingElementIndex + 1; 

    if (leavingElementIndex >= 0 && contentOffset > 0) { 
     CGRect leavingFrame = [[[scrollView subviews] objectAtIndex:leavingElementIndex] frame]; 
     CGRect enteringFrame = [[[scrollView subviews] objectAtIndex:entereingElementIndex] frame]; 

     float scalePerentage = (contentOffset - (_scrollView.smallBoxWidth * leavingElementIndex))/(_scrollView.smallBoxWidth); 
     enteringFrame.size.width = _scrollView.smallBoxWidth + (_scrollView.smallBoxWidth * scalePerentage); 
     enteringFrame.size.height = _scrollView.smallBoxHeight + (_scrollView.smallBoxHeight * scalePerentage); 
     enteringFrame.origin.x = [_scrollView leftMostPointAt:entereingElementIndex] - (_scrollView.smallBoxWidth * scalePerentage); 

     [[[scrollView subviews] objectAtIndex:entereingElementIndex] setFrame:enteringFrame]; 

     leavingFrame.size.width = _scrollView.largeBoxWidth - (_scrollView.smallBoxWidth * scalePerentage); 
     leavingFrame.size.height = _scrollView.largeBoxHeight - (_scrollView.smallBoxHeight * scalePerentage); 

     [[[scrollView subviews] objectAtIndex:leavingElementIndex] setFrame:leavingFrame]; 

     //Reset the other visible frames sizes 
     int index = 0; 
     for (UIView *view in [scrollView subviews]) { 

      if([view isKindOfClass:[SlidingView class]] && index > entereingElementIndex) { 
       CGRect frame = view.frame; 
       frame.size.width = _scrollView.smallBoxWidth; 
       frame.size.height = _scrollView.smallBoxHeight; 
       frame.origin.x = [_scrollView leftMostPointAt:index]; 
       [view setFrame:frame]; 
      } 

      index++; 
     } 

    }  
} 

C'est ce qu'il ressemble à la fin:

End Result http://stuff.haagen.name/iOS%20scroll%20resize.gif

+0

Ceci est implémenté plus complètement dans le projet suivant: https://github.com/kantega/meetingrooms –