1

UIImageView回転に問題があります。

UIImageView広告のようなアニメーションで水平方向に回転する必要があります。

これを行うには、次のコードを使用しています。

[UIView animateWithDuration:1.0
        delay:0.0
        options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
        animations:^{
             if (baddview) {
                 baddview = FALSE;
                 adimageView.layer.transform = CATransform3DMakeRotation(0, 0, 1, 0);                          
             } else {
                 baddview = TRUE;
                 adimageView.layer.transform = CATransform3DMakeRotation(M_PI, 0, 1, 0);                          
             }
         }
         completion:^(BOOL finished) {
         }
];

イメージビューは必要に応じて回転していますが、イメージビューのイメージは 180 度回転した後のように反転して表示されます (ここでイメージを見ることができます)。

UIImageViewを回転させずに回転をアニメーション化するにはどうすればよいUIImageですか?

4

2 に答える 2

2

考えられるアプローチの 1 つは、2 つUIImageViewの s を作成し、それらをアニメーション化することです。あなたがしなければならないことは次のとおりです。

  1. アニメーション ブロックの前に、新しいUIImageViewを作成して現在の の後ろに配置しUIImageViewますが、回転が 180 であることを確認してください。
  2. 2 つのアニメーション ブロックを作成します。1 つは最初のビューを半分の時間 (つまり 0.5 秒) で90度回転させ、もう 1 つのブロックはビューを完全な時間 (つまり 1.0 秒) でアニメーション化します。CATransform3DIdentity

必要に応じてコードを追加します。

または、 のisDoubleSidedプロパティをCALayerに設定しますNO。次に、両方のビューを 180 度回転します。両面ではないため、上面図は非表示になります。


新しいシングルビュー プロジェクトを作成しUIButton、フリップを実行するために を追加しました。残りのコードは次のとおりです。

ヘッダー ファイル:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
    UIImageView* _imageView1;
    UIImageView* _imageView2;
}

- (IBAction)flip:(id)sender;

@end

実装ファイル:

#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImage* image1 = [UIImage imageNamed:@"gaara1.png"];
    _imageView1 = [[UIImageView alloc] initWithImage:image1];
    [_imageView1 setFrame:CGRectMake((CGRectGetWidth(self.view.bounds) - 300)/2, 100.f, 300, 75)];

    UIImage* image2 = [UIImage imageNamed:@"gaara2.png"];
    _imageView2 = [[UIImageView alloc] initWithImage:image2];
    [_imageView2 setFrame:CGRectMake((CGRectGetWidth(self.view.bounds) - 300)/2, 100.f, 300, 75)];
    // the second imageView is in the back
    [self.view addSubview:_imageView2];
    [self.view addSubview:_imageView1];

}

- (IBAction)flip:(id)sender {
    [_imageView1.layer setDoubleSided:NO];
    [_imageView2.layer setDoubleSided:NO];

    [_imageView1.layer setZPosition:10.f];

    [_imageView1.layer setTransform:CATransform3DIdentity];
    [_imageView2.layer setTransform:CATransform3DMakeRotation(-M_PI, 1.f, 0.f, 0.f)];

    [UIView animateWithDuration:1.0
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                         _imageView1.layer.transform = CATransform3DMakeRotation(M_PI, 1.f, 0.f, 0.f);
                         _imageView2.layer.transform = CATransform3DIdentity;
                     }
                     completion:NULL];

}

@end

画像:

ここに画像の説明を入力

ここに画像の説明を入力

于 2012-09-10T07:25:30.977 に答える
0

コードが問題を引き起こす可能性があります。UIViewアニメーションは、レイヤーではなく、UIViewのプロパティをアニメーション化するためのものです。

UIViewアニメーションブロックでレイヤー変換を操作しようとすると、問題が発生することが予想されます。UIViewアニメーションブロックのビュープロパティの変更に制限する必要があります。

[UIView animateWithDuration:1.0
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
                 animations:^{
                     _imageView1.transform = CGAffineTransformMakeRotation(M_PI);
                     _imageView2.transform = CGAffineTransformIdentity;
                 }
                 completion:NULL];

CAAnimationオブジェクトは、レイヤーをアニメーション化するためのものです。

ビューのレイヤー変換をアニメーション化する場合は、直接実行するか(暗黙のアニメーションを提供します)、CABasicAnimationオブジェクトを作成してより複雑なアニメーションを実行します。

于 2012-09-10T19:55:32.127 に答える