objective framework developer apple iphone ios core-animation quartz-graphics cgaffinetransform

iphone - framework - (Escala) Zoom en una vista UIV en un punto



swift ios documentation (2)

En caso de que alguien esté interesado, aquí está la solución Swift 3.0, a la que agregué la posibilidad de desvanecerse correctamente.

(Sé que faltan dos enumeraciones, pero el código aún es legible y creo que entenderá el concepto)

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

Algo que no entiendo de las transformaciones. Quiero ampliar para decir la esquina superior derecha de una vista (la vista principal). Utilizo CGAffineTransformScale y he intentado configurar tanto center / anchorPoint como CGAffineTransformMakeTranslation en vano.

No puedo averiguar cómo configurar la traducción correctamente para que se acerque a este punto.

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


Está configurando el centro de la vista en la esquina superior derecha. Eso significa que estás acercándote a un lugar en la parte inferior izquierda del centro.

Prueba esto

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

Esto establecerá el centro de la vista aumentada en la esquina inferior izquierda, efectivamente acercando con la esquina superior derecha fija.

Este código no tiene la altura codificada, que es un poco más portátil (para un iPad de iPhone 5).

Primero debe guardar h antes de configurar la propiedad de transform , porque después de eso no debe confiar en el valor del frame .

editar

Para que funcione para cualquier báscula, usa esto:

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

Para que funcione en la parte inferior izquierda, usa esto:

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

Para que funcione en la parte inferior derecha, usa esto:

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

Vea también: Cómo escalar (ampliar) una UIView a un CGPoint dado