2010-07-13 6 views
3

J'ai des difficultés à obtenir un UIScrollView en mosaïque pour effectuer un zoom avant et arrière correct avec le zoom par pincement. Le problème est que lorsqu'un zoom pincé se produit, la vue résultante n'est généralement pas centrée dans la même région.Trouver le point central d'un UIScrollView lors d'un zoom

Détails: L'application commence par une image en mosaïque de 500 x 500. Si un utilisateur effectue un zoom avant, il se positionnera sur 1000x1000 et les mosaïques seront redessinées. Pour tout le zoom affecte, etc. Je laisse juste le UIScrollView faire c'est chose. Lorsque scrollViewDidEndZooming:withView:atScale: est appelée, je redessine les tuiles (comme vous pouvez le voir dans de nombreux exemples et d'autres questions ici).

Je pense que j'ai percé le problème à calculer correctement le centre de la vue quand je reçois à scrollViewDidEndZooming:withView:atScale: (je peux centrer sur une amende de point connu après que je redessine).

Ce que je suis actuellement en utilisant:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    // as an example, create the "target" content size 
    CGSize newZoomSize = CGSizeMake(1000, 1000); 

    // get the center point 
    CGPoint center = [scrollView contentOffset]; 
    center.x += [scrollView frame].width/2; 
    center.y += [scrollView frame].height/2; 

    // since pinch zoom changes the contentSize of the scroll view, translate this point to 
    // the "target" size (from the current size) 
    center = [self translatePoint:center currentSize:[scrollView contentSize] newSize:newZoomSize]; 

    // redraw... 
} 

/* 
    Translate the point from one size to another 
*/ 
- (CGPoint)translatePoint:(CGPoint)origin currentSize:(CGSize)currentSize newSize:(CGSize)newSize { 
    // shortcut if they are equal 
    if(currentSize.width == newSize.width && currentSize.height == newSize.height){ return origin; } 

    // translate 
    origin.x = newSize.width * (origin.x/currentSize.width); 
    origin.y = newSize.height * (origin.y/currentSize.height); 
    return origin; 
} 

Cela vous semble correct? Y a-t-il un meilleur moyen? Merci!

+0

Ne pouvez-vous pas utiliser un outil de reconnaissance de mouvements? Cela rendra les choses tellement plus faciles pour vous - mais pas disponible en 3.1 ou plus tôt. Donc, si vous ne ciblez pas la version 3.1 ou antérieure, je vous recommande fortement d'utiliser un UIGestureRecognizer. Vous pouvez obtenir un point qui est le centre entre les doigts. – jer

+0

Je ne sais pas si je peux laisser tomber le support 3.1, mais le UIGestureRecognizer est très joli! Pour l'instant, je vais chercher un moyen de trouver cela dans 3.1, mais le UIGestureRecognizer peut être le chemin à parcourir. – Rob

Répondre

1

La façon dont j'ai résolu cela jusqu'à présent est de stocker le point central initial de la vue lorsque le zoom commence. J'ai d'abord enregistrer cette valeur lorsque la méthode scrollViewDidScroll est appelée (et la vue déroulante est en zoom). Lorsque scrollViewDidEndZooming:withView:atScale: est appelée, j'utilise ce point central (et réinitialise la valeur enregistrée).

0

Le centre de la scrollview peut être trouvé en ajoutant sa propriété center, et sa propriété contentOffset.

aView.center = CGPointMake(
    self.scrollView.center.x + self.scrollView.contentOffset.x, 
    self.scrollView.center.y + self.scrollView.contentOffset.y); 
Questions connexes