web-dev-qa-db-fra.com

(Échelle) Zoom sur un UIView en un point

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) {}];
20
akaru

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é

34
mvds

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 })
}
1
Nighthawk