2011-03-27 35 views
20

我不了解转换的东西。我想放大说一个UIView(主视图)的右上角。我使用CGAffineTransformScale并尝试设置中心/ anchorPoint以及CGAffineTransformMakeTranslation都无济于事。(比例)放大到一个点UIView

我想不出如何正确设置翻译,以便它放大这一点。

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

有关缩放到任意点什么?例如,为了响应用户点击屏幕? – user978838 2011-10-05 07:55:52

回答

34

您正在将视图的中心设置为右上角。这意味着你正在放大中心左下角的某个位置。

试试这个

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

这将设置放大视图的左下角的中心,有效地拉近与固定右上角。

此代码没有硬编码的高度,这是一个更便携的(对iPhone 5的iPad)。

在设置transform属性之前,您需要先保存h,因为在此之后,您不应该依赖frame的值。

编辑

为了让任何规模s工作,使用此:

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

,使之成为左下角的工作,使用:

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

要使它适用于右下角,使用此:

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

参见:How to scale (zoom) a UIView to a given CGPoint

+0

谢谢,这对我的工作原理是一样的,但是它使得它更多地朝着3以上的刻度上的实际中心放大。对于右下角来说,这将如何工作?奇怪的是,这适用于我:self.view.center = CGPointMake(-280,-h) – akaru 2011-03-27 06:41:21

+1

这是正确的,因为放大视图的中心取决于比例。我添加了右下/左下和任何比例的示例。只要记住:首先你将视图放大(使它成为320 * s,480 * s大),然后你设置该视图的中心。 – mvds 2011-03-27 13:14:11

+0

太棒了!这是我错过的简单小算法,谢谢。如果我想轻松恢复,MakeTranslate会比设置中心更好吗? – akaru 2011-03-27 20:15:56

1

如果有人仍感兴趣,这里是雨燕3.0的解决方案,而我添加的可能性要正确淡出。

(我知道有两个枚举失踪,但代码仍然是可读的,我想你会得到的概念)

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