1

我有一个自定义 UIView。它初始化了两个矩形 UIBezierPaths,并且在 drawRect 中它只是填充了这两个路径。

这个视图被放置在一个按钮上。单击按钮时,会在 animateWithDuration 块内对其应用旋转:

icon.transform = CGAffineTransformMakeRotation(M_PI*-0.25);

这很好用。

再次单击该按钮时,我试图使视图旋转回其原始方向(反转旋转)。我努力了:

icon.transform = CGAffineTransformInvert(icon.transform);
icon.transform = CGAffineTransformMakeRotation(M_PI*0.25);
icon.transform = CGAffineTransformIdentity;

...以及许多其他变体,但它们似乎都不起作用。取而代之的是,视图被扭曲,直到它不再可见——有点拉伸到什么都没有。有时,重新应用第一个转换会将其恢复,但其他反转则不会。

我究竟做错了什么?

4

1 回答 1

1

在ios中,变换总是相对的,所以一旦变换完成,下一个变换应该是相对于前一个变换的。您可以简单地更改视图的框架并在第二次单击按钮时将其恢复为正常状态。即使单击,您也必须恢复框架。实现以下代码。如果您对它感到满意,您可以使用块级代码,因为它是新规范。

int noOfClicks = 0;

-(IBAction)yourBtnAction:(id)sender
{
    noOfClicks++;

    if(noOfClicks %2 != 0)
    {
        [UIView beginAnimations:@"Rotate" context:nil];
        [UIView setAnimationDuration:1.0];
        [UIView setAnimationDelegate:self];
        CGRect frame=yourView.frame;
        frame.origin.y+=20;
        yourview.frame=frame;
        [UIView commitAnimations];
    }
    else
    {
        [UIView beginAnimations:@"Rotate" context:nil];
        [UIView setAnimationDuration:1.0];
        [UIView setAnimationDelegate:self];
        CGRect frame=yourView.frame;
        frame.origin.y-=20;
        yourview.frame=frame;
        [UIView commitAnimations];
    }
}

如果您不想进行太多更改,则可以使用以下方法恢复但使用相同的逻辑:

[UIView beginAnimations:@"Rotate back" context:nil];
[UIView setAnimationDuration:1.0];

yourView.transform = CGAffineTransformIdentity;

[UIView commitAnimations];
于 2012-05-11T20:37:03.330 回答