如何使用CGAffineTransform在锚点进行缩放?

时间:2010-09-30 08:36:16

标签: cocoa-touch opengl ios4 matrix

编辑以更好地解释我的问题

我正在尝试使用自定义视图(而不是UIView)执行缩放操作。视图具有平移,缩放,旋转值。我在调用glPushMatrix()和glPopMatrix()之间使用如下。

- (void)transform
{
    glTranslatef(translation.x + anchor.x, translation.y + anchor.y, 0.0f);
    //glRotatef(-rotation * 57.2957795f, 0.0f, 0.0f, 1.0f);
    glScalef(scale.x, scale.y, 1.0f);
    glTranslatef(-anchor.x, -anchor.y, 0.0f);
}

我试图弄清楚我应该如何修改锚点和/或平移值,以便缩放操作相对于屏幕上显示的内容。在1:1比例下,我可以简单地使用原始屏幕坐标作为锚点并执行上述转换。但是当视图已经处于某个任意比例/位置时,锚点和/或翻译需要考虑到这一点。

到目前为止,这是我已经想到的:

1)在屏幕坐标中获取从比例中心到视图原点的位移。

2)缩放此值,使其位于视图的局部坐标系中。

3)现在我有了用于缩放的新锚点。我将视图的锚点设置为此值。

仅此一点似乎还不够。我想我错过了一个翻译组件,或者是另一个进入新锚点的变量。我错过了什么?

3 个答案:

答案 0 :(得分:2)

我找到了解决方案。除了定义原始视图的变换之外,我还使用了专门用于缩放操作的单独变换。我简单地将两者结合起来得到我想要的结果 - 这是为了确保缩放相对于原始视图。

答案 1 :(得分:0)

某些CGAffine动画会假设您不希望出现的矩阵成分。

例如,我发现CGAffineTransformMakeTranslation也影响了视图的旋转。出于这个原因,如果您对CGAffineTransform

的多个实例进行汇总,我建议不要使用'Make'转换

另外,在上面的例子中,我可以看到你假设你的矩阵理解你的两个翻译应该在不同的时间发生。变换矩阵是在任何1个时间点关于对象的一组物理属性。

  • 您希望对象移动到-anchor 和比例

  • 您希望对象移动回来 锚

这些应被视为两种不同的动画

你应该使用'关键帧动画'来做这个,这是一个例子:CGPath Animation

或者,您可以将两个CGAffineTransform方法链接在一起。

 -(void)Anim1
    {
    [UIView beginAnimations:@"Anim1_Done" context:NULL];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self];
    UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];
    //DO STUFF HERE


    [UIView commitAnimations];
    }


- (void)animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context
{


    if ([animationID isEqualToString:@"Anim1_Done"])
    {
    [self Anim2];
    }
}


 -(void)Anim2
    {
    [UIView beginAnimations:@"Anim2_Done" context:NULL];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self];
    UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];
    //DO STUFF HERE
    [UIView commitAnimations];
    }

答案 2 :(得分:0)

您的转换意图仍然不完全清楚。

CGAffineTransformMakeTranslation变换将创建到达所需点所需的平移矩阵,但正如我在其他答案中提到的,一些make变换会对旋转等其他内容做出假设,如果你的对象没有旋转,因此无法重置然后这不是一个问题,否则你可以使用矩阵的翻译组件:

Transform.tx;
Transform.ty;

编辑:3个单独的动画应该用3个单独的矩阵完成:

baseMatrix = CGAffineTransformIdentity;

affineMatrix1 = CGAffineTransformTranslate(baseMatrix, -anchor.x, -anchor.y);

affineMatrix2 = CGAffineTransformScale(baseMatrix, scale.x, scale.y);

affineMatrix3 = CGAffineTransformTranslate(baseMatrix, anchor.x, anchor.y);