1

カスタムUIViewがあります。2つの長方形のUIBezierPathを初期化し、drawRectではこれらの2つのパスを単純に埋めます。

このビューはボタンに配置されます。ボタンがクリックされると、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では、変換は常に相対的であるため、変換が実行されると、次の変換は前の変換に対して相対的である必要があります。ビューのフレームを変更し、ボタンを2回クリックするだけで通常のフレームに戻すことができます。クリックした場合でも、フレームを元に戻す必要があります。次のコードを実装します。新しい標準であるため、問題がなければブロックレベルのコードを使用できます。

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 に答える