1

そのため、タップしたときに CGAffineTransform を適用して、現在の状態を強調表示する UIButton (画像で構成される) があります。

- (void)animateMasterAddButton
{
    CGAffineTransform buttonTransform;

    // Button state hasn't been changed at this point, so selected == NO applies to when the button is *about* to be selected 
    if(self.masterAddButton.selected == NO)
    {
        CGAffineTransform buttonRotationTransform = CGAffineTransformMakeRotation((135.0 * M_PI) / 180);
        buttonTransform = CGAffineTransformConcat(CGAffineTransformIdentity, buttonRotationTransform);
    }
    else
    {
        buttonTransform = CGAffineTransformIdentity;
    }

    [UIView animateWithDuration: 0.3
                     animations: ^{
                         self.masterAddButton.transform = buttonTransform;
                     }];
}

デバイスを同じ向きに保つと、これは正常に機能します。ただし、デバイスを回転させると、UIButton が非表示になりますが、これは UIButton が選択されている場合(回転変換が有効な場合のみ) に限られます。ボタンのフレームと境界をビュー コントローラーのwillRotateToInterfaceOrientation:duration:メソッドに記録したところ、次の結果が得られました。

ボタンが選択されていない状態でデバイスを回転させる:

フレーム: {{8, 8}, {57, 57}}
境界: {{0, 0}, {57, 57}} (これらは正しい値です)

ボタンを選択してデバイスを回転:

フレーム: {{-4, -4}, {80, 80}}
境界: {{0, 0}, {0, 113.137}}

2 番目の結果のセットでは、回転した画像の角が外側に出ているため、フレームは正しく、より多くのスペースを占有します。ただし、境界は何かがおかしいことを示しています。境界幅がゼロであるため、ボタンはありますが、狭すぎてレンダリングできないと思います。

なぜこれが起こるのか、どうすれば修正できるのか、誰でも教えてもらえますか?

4

1 に答える 1

0

少し横向きに考えて、それを釘付けにしました。基本的に、回転アニメーションが完了すると、変換されたボタン イメージは、アニメーションによって適用されたのと同じ量だけ回転されたバージョンに置き換えられます (このプロセスを実行する UIImage カテゴリ メソッドを記述しました)。次に、 を使用してボタンの変換を無効にしCGAffineTransformIdentityます。デバイスを回転させたときにボタンに変換が存在しないため、そのままになります:-)

コードは次のとおりです。

- (void)animateMasterAddButton
{
    CGFloat addButtonRotationAngle = AddButtonRotationAngle * -1.0;    // AddButtonRotationAngle is a const float defined at the top of .m file
    CGAffineTransform buttonTransform;
    UIImage *rotatedAddButtonImage = [UIImage imageNamed: @"Add button"];

    if(self.masterAddButton.selected == NO)
    {
        addButtonRotationAngle =  AddButtonRotationAngle;
        rotatedAddButtonImage = [UIImage rotatedImageFromImage: rotatedAddButtonImage withAngle: (addButtonRotationAngle * M_PI) / 180];
        // rotatedImageFromImage:withAngle: is a self-written category method on UIImage
    }

    CGAffineTransform buttonRotationTransform = CGAffineTransformMakeRotation((addButtonRotationAngle * M_PI) / 180);
    buttonTransform = CGAffineTransformConcat(CGAffineTransformIdentity, buttonRotationTransform);

    [UIView animateWithDuration: 0.3
                     animations: ^{
                         self.masterAddButton.transform = buttonTransform;
                     }
                     completion: ^(BOOL finished) {
                         [self.masterAddButton setImage: rotatedAddButtonImage forState: UIControlStateNormal];
                         self.masterAddButton.transform = CGAffineTransformIdentity;
                     }];
}
于 2012-09-11T10:13:27.333 に答える