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