Question

J'ai une instance de UIScrollview contenant une instance de UIView. UIView est juste un conteneur pour un tableau horizontal d'instances UIImageView. - Le zoom est fourni par UIScrollView et UIScrollViewDelegate. Je voudrais contraindre le zoom à ne se dérouler que sur l’axe horizontal, sans écaillage vertical. Comment faire cela?

Existe-t-il un moyen, par exemple, de sous-classer UIView et de remplacer la méthode appropriée pour empêcher la mise à l'échelle verticale? J'aime cette approche, mais je ne sais pas exactement quelle méthode redéfinir et ce que cette méthode doit réellement faire.

Salut, Doug

Était-ce utile?

La solution

Semblable à ce que je décris dans cette réponse , vous pouvez créer une sous-classe UIView et substituer la méthode -setTransform: accessor pour ajuster la transformation que UIScrollView essaiera d’appliquer à votre UIView. Définissez cette UIView pour héberger vos sous-vues de contenu et en faire la sous-vue de UIScrollView.

Dans votre -setTransformed -setTransform :, remplacé, vous devez intégrer la transformation que UIScrollView souhaite appliquer et l'ajuster afin que la mise à l'échelle ne prenne effet que dans un sens. De la documentation sur la manière dont les matrices CGAffineTransform sont construites , je pense que la mise en oeuvre suivante devrait limiter la mise à l'échelle à la direction horizontale:

- (void)setTransform:(CGAffineTransform)newValue;
{
 CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
 constrainedTransform.a = newValue.a;
 [super setTransform:constrainedTransform];
}

Autres conseils

Avec OS 3.0, vous pouvez indiquer au zoom d’agrandir un rectangle dans la vue à défilement. J'ai cela dans ma logique qui détecte les robinets.

CGRect zoomRect = [self zoomRectForScale:newScale withCenter:CGPointMake(tapPoint.x, tapPoint.y) inScrollView:scrollView];
[scrollView zoomToRect:zoomRect animated:YES];

Pour l’autre partie, vous devrez étirer vos vues d’image du rapport entre le nouveau cadre et l’original et les centrer sur le même point central. Vous pouvez le faire dans une animation dont le minutage est identique à celui de l’animation de zoom pour qu’elle ait l’air juste, mais je pense que ce sera la seule façon de le faire.

Dans scrollViewDidZoom: , réglez les variables de votre vue de contenu en fonction de zoomScale , réinitialisez zoomScale sur 1.0, puis setNeedsDisplay sur la vue du contenu. Manipulez le zoom réel (dans la direction souhaitée) dans drawRect: de votre affichage de contenu.

Les détails les plus moches:

  1. Pendant le zoom, UIScollView change les contentOffset et contentScale , afin de sauvegarder ces valeurs antérieures dans scrollViewWillBeginZooming: et dans scrollViewDidZoom: pour pouvoir calculer vous-même un nouveau contentOffset en fonction du zoom.

  2. Etant donné que changer zoomScale déclenchera immédiatement un autre scrollViewDidZoom: , vous devez définir un BOOL avant (et effacer après) la réinitialisation de zoomScale . Testez le BOOL au début de scrollViewDidZoom: et renvoyez-le si vrai.

  3. Vous devrez peut-être inhiber scrollViewDidScroll: pendant le zoom (testez une BOOL; définissez-le dans scrollViewWillBeginZooming: et supprimez-le dans scrollViewDidEndZooming: ) afin que vos propres contentOffsets soient utilisés pendant le zoom.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top