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!
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
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