20

Algo que no entiendo acerca de las transformaciones. Quiero acercarme para decir la esquina superior derecha de una UIView (la vista principal). Yo uso CGAffineTransformScale y he intentado configurar tanto center/anchorPoint como CGAffineTransformMakeTranslation en vano.(Escala) Zoom en una UIView en un punto

No puedo entender cómo ajustar la traducción correctamente para que se acerque en 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) {}]; 
+0

¿Qué pasa con el zoom a puntos arbitrarios? Por ejemplo, en respuesta a un usuario que toca la pantalla? – user978838

Respuesta

34

Estás configurando el centro de la vista en la esquina superior derecha. Eso significa que estás enfocando en algún lugar hacia la parte inferior izquierda del centro.

probar este

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 ampliada hasta la esquina inferior izquierda, el zoom de manera efectiva en 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 establecer la propiedad transform, porque después de eso no debe confiar en el valor de frame.

edición

Para hacer que funcione para cualquier escala s, utilice 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 hacer que funcione para la parte inferior izquierda, utilice 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 hacer funciona para la parte inferior derecha, use 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) {}]; 

Consulte también: How to scale (zoom) a UIView to a given CGPoint

+0

Gracias, esto funciona igual que yo, pero hace que se acerque más al centro real en escalas superiores a 3. ¿Cómo funcionaría esto, por ejemplo, para la esquina inferior derecha? Por extraño que parezca, esto funciona para mí: self.view.center = CGPointMake (-280, -h) – akaru

+1

Eso es correcto, ya que el centro de la vista ampliada depende de la escala. Agregué ejemplos para la parte inferior derecha/izquierda y para cualquier escala. Solo recuerde: primero explota la vista (por lo que es 320 * s, 480 * s grande), y luego está configurando el centro de esa vista. – mvds

+0

¡Brillante! Ese es el pequeño algoritmo simple que me faltaba, gracias. ¿Sería MakeTranslate una mejor opción que establecer el centro, si quiero revertir fácilmente? – akaru

1

Por si alguien todavía está interesado, aquí es la solución Swift 3.0, a la que añade la posibilidad de desaparecer a cabo correctamente.

(Sé que hay dos enumeraciones que faltan, pero el código sigue siendo legible y creo que obtendrá 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 }) 
} 
Cuestiones relacionadas