Quelque chose que je ne comprends pas à propos des transformations. Je souhaite effectuer un zoom avant pour afficher le coin supérieur droit d'une vue UIView (la vue principale). J'utilise CGAffineTransformScale
et j'ai essayé à la fois de définir le centre/anchorPoint ainsi que CGAffineTransformMakeTranslation
sans succès.
Je n'arrive pas à comprendre comment configurer correctement la traduction pour qu'elle effectue un zoom avant sur ce point.
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, 2, 2);
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
self.view.transform = tr;
self.view.center = CGPointMake(480,0);
} completion:^(BOOL finished) {}];
Vous définissez le centre de la vue dans le coin supérieur droit. Cela signifie que vous effectuez un zoom avant quelque part en bas à gauche du centre.
Essaye ça
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, 2, 2);
CGFloat h = self.view.frame.size.height;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
self.view.transform = tr;
self.view.center = CGPointMake(0,h);
} completion:^(BOOL finished) {}];
Cela définira le centre de la vue agrandie dans le coin inférieur gauche, en effectuant effectivement un zoom avant avec le coin supérieur droit fixe.
Ce code n'a pas la hauteur codée en dur, ce qui est un peu plus portable (sur un iPad de l'iPhone 5).
Vous devez d’abord enregistrer h
avant de définir la propriété transform
, car vous ne devriez plus vous en remettre à la valeur frame
.
edit
Pour que cela fonctionne pour n'importe quelle échelle s
, utilisez ceci:
CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
self.view.transform = tr;
self.view.center = CGPointMake(w-w*s/2,h*s/2);
} completion:^(BOOL finished) {}];
Pour que cela fonctionne en bas à gauche, utilisez ceci:
CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
self.view.transform = tr;
self.view.center = CGPointMake(w*s/2,h-h*s/2);
} completion:^(BOOL finished) {}];
Pour que cela fonctionne en bas à droite, utilisez ceci:
CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
self.view.transform = tr;
self.view.center = CGPointMake(w-w*s/2,h-h*s/2);
} completion:^(BOOL finished) {}];
Voir aussi: Comment redimensionner (zoomer) un UIView sur un CGPoint donné
Si vous êtes toujours intéressé, voici la solution Swift 3.0, à laquelle j'ai ajouté la possibilité de disparaître correctement.
(Je sais qu'il manque deux énumérations, mais le code est toujours lisible et je pense que vous comprendrez le concept)
func animateZoom(direction: ZoomDirection, type: ZoomType, duration: Double = 0.3, scale: CGFloat = 1.4) {
var cx, cy: CGFloat
var tr: CGAffineTransform = CGAffineTransform.identity
if (type == .IN) { tr = self.transform.scaledBy(x: scale, y: scale) }
let h: CGFloat = self.frame.size.height;
let w: CGFloat = self.frame.size.width;
if (type == .IN) {
switch direction {
case .LEFT_DOWN:
cx = w*scale/2
cy = h-h*scale/2
break
case .LEFT_UP:
cx = w*scale/2
cy = h*scale/2
break
case .RIGHT_UP:
cx = w-w*scale/2
cy = h*scale/2
break
case .RIGHT_DOWN:
cx = w-w*scale/2
cy = h-h*scale/2
break
}
} else {
cx = w/scale/2
cy = h/scale/2
}
UIView.animate(withDuration: duration, delay: 0, options: [.curveEaseInOut], animations: {
self.transform = tr
self.center = CGPoint(x: cx, y: cy)
}, completion: { finish in })
}