在Objective-C中翻译和缩放UIView

时间:2015-07-17 07:13:57

标签: objective-c frame cgaffinetransform

我想通过将其中一个点对准屏幕中心然后将其放大来为视图设置动画。

所以,如果我的屏幕(S)中包含一个视图(V),并且某个点(x):

+-------------+
|S-----------+|
||V          ||
||           ||
||           ||
||           ||
||           ||
||  x        ||
||           ||
|+-----------+|
+-------------+

我希望它能够动画到这个位置:

   +-----------+
+---V---------+|
|S |          ||
|  |          ||
|  |          ||
|  |          ||
|  |   x      ||
|  |          ||
|  +----------|+
|             |
|             |
+-------------+

其中点在屏幕中居中,然后按如下方式缩放:

+-------------------+
|V                  |
|                   |
|                   |
|                   |
|+-------------+    |
||S            |    |
||             |    |
||             |    |
||             |    |
||      x      |    |
||             |    |
||             |    |
||             |    |
||             |    |
|+-------------+    |
+-------------------+

然而,即使使用CGAffineTransformConcat,我也无法做到这一点,我认为它完全适用于此类情况。

我试过这个:

CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(deltaPoint.x, deltaPoint.y);
CGAffineTransform scaleTransform = CGEqualAffineTransformMakeScale(40);

self.screenView.transform = CGAffineTransformConcat(translateTransform, scaleTransform);

其中deltaPointCGPointxy等于点的绝对坐标之间的距离(相对于屏幕)和屏幕中心的坐标,但它略微向右动画点。

我也尝试在缩放后无法计算deltaPoint

self.screenView.transform = CGEqualAffineTransformMakeScale(40);

// calculate deltaPoint

self.screenView.transform = CGAffineTransformTranslate(self.screenView.transform, deltaPoint.x, deltaPoint.y);

在这两种情况下,如果我注释掉缩放变换,则翻译有效,它将其完全移动到中心位置,因此问题不在deltaPoint计算中。

3 个答案:

答案 0 :(得分:2)

您希望使用比例因子(Sx,Sy)缩放视图,并将点(x0,y0)移动到(x1,y1)。你计算了dx,dy。所以,让我们做一些计算:

Sx.x0 + a = x0 + dx => a = dx - (Sx-1).x0
Sy.y0 + b = y0 + dy => b = dy - (Sy-1).y0

使用Sx = Sy = 40,我们有a = dx - 39.x0b = dx - 39.y0。所以我们像那样转换矢量

CGAffineTransform scaleTransform = CGAffineTransformMake(40, 0, 0, 40, a, b);
self.screenView.transform = CGAffineTransformConcat(translateTransform, scaleTransform);
在任何转换之前,

x0, y0是您在x视图中的原始点v。你可以称之为pointX.x, pointX.y。 您在示例中使用的比例因子为40,因此我重复使用它。因此Sx-1Sy - 1将返回相同的值39

答案 1 :(得分:0)

我理解的是在视图v和点x转换到其所需位置之后,您希望视图从点x放大,因此即使在缩放后,点x仍保留在屏幕的中心,如果它是真的然后在翻译之后,您需要调整锚点,使锚点视角等于x。

答案 2 :(得分:0)

我认为screenView是你的观点(V)

所以你可以尝试这样的事情:

[UIView animateWithDuration:2 // put translation duration here
                 animations:^{
                     self.screenView.center = CGPointMake(self.screenView.center.x + deltaPoint.x, self.screenView.center.y + deltaPoint.y);
                 }
                 completion:^(BOOL finished) {
                     [UIView animateWithDuration:2 // put scale duration here
                                      animations:^{
                                          self.screenView.transform = CGAffineTransformMakeScale(1.1, 1.1); // here the final size will be 110%
                                      }
                                      completion:nil];
                 }
 ];

如果你想同时这样做,那么只需将比例放在同一个区块中:

[UIView animateWithDuration:2 // put translation duration here
                 animations:^{
                     self.screenView.center = CGPointMake(self.screenView.center.x + deltaPoint.x, self.screenView.center.y + deltaPoint.y);
                     self.screenView.transform = CGAffineTransformMakeScale(1.1, 1.1); // here the final size will be 110%
                 }
                 completion:nil
 ];