7種類のアニメーションを実行する「DCAnimation」クラス

7種類のアニメーションをシンプルな記述で実行する「DCAnimation」クラスを改訂しました。

今回の更新により、アニメーション終了時のメソッドやデリゲートメソッドを指定できるようになっています。また、クラスメソッドを廃止し、2つのアニメーションを追加しています。

このクラスの主な機能は以下の通りです。

主な機能

  1. フェードイン・フェードアウトアニメーション
  2. スライドインアニメーション
  3. 回転アニメーション
  4. 拡大縮小アニメーション
  5. 拡大アニメーション (バウンド機能付き)
  6. 縮小アニメーション
  7. 平行移動アニメーション

ダウンロード

使用方法

フェードインアニメーションの場合

1
2
3
4
5
6
    //初期化
    DCAnimation *dcAnimation = [[DCAnimation alloc] init];
    //アニメーション秒数とフェードモードを指定
    [dcAnimation fade:self.animationTargetImage
             duration:0.5f
             isFadeIn:YES];

スライドアニメーションの場合

1
2
3
4
5
6
    //初期化
    DCAnimation *dcAnimation = [[DCAnimation alloc] init];
    //アニメーション秒数と目標座標・サイズを指定
    [dcAnimation slide:self.animationTargetImage
              duration:0.5f
               aimRect:CGRectMake(64, 64, 57, 57)];

サンプルソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//フェードアニメーション実行
- (IBAction)startFadeAnimation:(id)sender
{
    DCAnimation *dcAnimation = [[DCAnimation alloc] init];
    dcAnimation.dc_delegate = (id)self;
    //アニメーション秒数とフェードモードを指定
    [dcAnimation fade:self.animationTargetImage
             duration:0.5f
             isFadeIn:_isAnimationTargetFadeIn];
    //フェードインフラグ切り替え
    _isAnimationTargetFadeIn = !_isAnimationTargetFadeIn;
}

//スライドアニメーション実行
- (IBAction)startSlideAnimation:(id)sender
{
    DCAnimation *dcAnimation = [[DCAnimation alloc] init];
    dcAnimation.dc_delegate = (id)self;
    //アニメーション秒数と目標座標・サイズを指定
    [dcAnimation slide:self.animationTargetImage
              duration:0.5f
               aimRect:CGRectMake(64, 64, 57, 57)];
}

//回転アニメーション実行
- (IBAction)startRotateAnimation:(id)sender
{
    DCAnimation *dcAnimation = [[DCAnimation alloc] init];
    dcAnimation.dc_delegate = (id)self;
    //アニメーション秒数と目標回転度数を指定
    [dcAnimation rotate:self.animationTargetImage
               duration:0.5f
               aimAngle:90];
}

- (IBAction)startScaleAnimation:(id)sender
{
    DCAnimation *dcAnimation = [[DCAnimation alloc] init];
    dcAnimation.dc_delegate = (id)self;
    //アニメーション秒数と目標スケール値を指定
    [dcAnimation scale:self.animationTargetImage
              duration:0.5f
              aimScale:2.0f];
}

- (IBAction)startScaleUpDownAnimation:(id)sender
{
    DCAnimation *dcAnimation = [[DCAnimation alloc] init];
    dcAnimation.dc_delegate = (id)self;
    if (_isAnimationTargetScaleUp) {
        //アニメーション秒数を指定
        [dcAnimation scaleDown:self.animationTargetImage
                      duration:0.5f];
    } else {
        //アニメーション秒数とバウンドの有無を指定
        [dcAnimation scaleUp:self.animationTargetImage
                    duration:0.5f
                     isBound:YES];
    }
    //フェードインフラグ切り替え
    _isAnimationTargetScaleUp = !_isAnimationTargetScaleUp;
}

- (IBAction)startTranslateAnimation:(id)sender
{
    DCAnimation *dcAnimation = [[DCAnimation alloc] init];
    dcAnimation.dc_delegate = (id)self;
    //アニメーション秒数とXYの移動量を指定
    [dcAnimation translate:self.animationTargetImage
                  duration:0.5f
              movePosition:100];
}

ソースコード

DCAnimation.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#import <UIKit/UIKit.h>

#define ANIM_ID_FADE       @"animation_fade"
#define ANIM_ID_SLIDE      @"animation_slide"
#define ANIM_ID_ROTATE     @"animation_rotate"
#define ANIM_ID_SCALE      @"animation_scale"
#define ANIM_ID_SCALE_UP   @"animation_scale_up"
#define ANIM_ID_SCALE_DOWN @"animation_scale_down"
#define ANIM_ID_TRANSLATE  @"animation_translate"

@protocol DCAnimationDelegate;

@interface DCAnimation : UIView {
    id<DCAnimationDelegate>     _dc_delegate;
    UIView                      *_targetView;
    BOOL                        _isBound;
}

#pragma mark - property
@property (nonatomic, strong) id<DCAnimationDelegate> dc_delegate;
@property (nonatomic, retain) UIView *targetView;
@property (nonatomic, assign) BOOL isBound;

#pragma mark - public method
- (void)fade:(UIView *)view duration:(float)duration isFadeIn:(BOOL)isFadeIn;
- (void)slide:(UIView *)view duration:(float)duration aimRect:(CGRect)rect;
- (void)rotate:(UIView *)view duration:(float)duration aimAngle:(float)angle;
- (void)scale:(UIView *)view duration:(float)duration aimScale:(float)scale;
- (void)scaleUp:(UIView *)view duration:(float)duration isBound:(BOOL)isBound;
- (void)scaleDown:(UIView *)view duration:(float)duration;
- (void)translate:(UIView *)view duration:(float)duration movePosition:(float)position;

@end

#pragma mark - delegate method
@protocol DCAnimationDelegate <NSObject>
@optional
@end

DCAnimation.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#import "DCAnimation.h"

@implementation DCAnimation

@synthesize dc_delegate;
@synthesize targetView = _targetView;
@synthesize isBound = _isBound;

#pragma mark - Animations

// フェードアニメーション
- (void)fade:(UIView *)view duration:(float)duration isFadeIn:(BOOL)isFadeIn
{
    _targetView = view;
    [UIView beginAnimations:ANIM_ID_FADE context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:duration];
    _targetView.alpha = isFadeIn ? 0 : 1.0f;
    _targetView.alpha = isFadeIn ? 1.0f : 0;
    [UIView commitAnimations];
}

// スライドアニメーション
- (void)slide:(UIView *)view duration:(float)duration aimRect:(CGRect)rect
{
    _targetView = view;
    [UIView beginAnimations:ANIM_ID_SLIDE context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:duration];
    [_targetView setFrame:rect];
    [UIView commitAnimations];
}

// 回転アニメーション
- (void)rotate:(UIView *)view duration:(float)duration aimAngle:(float)angle
{
    _targetView = view;
    [UIView beginAnimations:ANIM_ID_ROTATE context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:duration];
    CGAffineTransform rotate = CGAffineTransformMakeRotation(angle * (M_PI / 180.0f));
    [_targetView setTransform:rotate];
    [UIView commitAnimations];
}

// 拡縮アニメーション
- (void)scale:(UIView *)view duration:(float)duration aimScale:(float)scale
{
    _targetView = view;
    [UIView beginAnimations:ANIM_ID_SCALE context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:duration];
    CGAffineTransform aimScale = CGAffineTransformMakeScale(scale, scale);
    [_targetView setTransform:aimScale];
    [UIView commitAnimations];
}

// 拡大アニメーション
- (void)scaleUp:(UIView *)view duration:(float)duration isBound:(BOOL)isBound
{
    _targetView = view;
    _targetView.transform = CGAffineTransformMakeScale(0.1, 0.1);
    _targetView.alpha = 0;
    [UIView beginAnimations:ANIM_ID_SCALE_UP context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:duration];
    _isBound = isBound;
    _targetView.transform = CGAffineTransformMakeScale(_isBound ? 1.05f : 1.0f, _isBound ? 1.05f : 1.0f);
    _targetView.alpha = 1;
    [UIView commitAnimations];
}

// 縮小アニメーション
- (void)scaleDown:(UIView *)view duration:(float)duration
{
    _targetView = view;
    [UIView beginAnimations:ANIM_ID_SCALE_DOWN context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:duration];
    _targetView.transform = CGAffineTransformMakeScale(0.1, 0.1);
    _targetView.alpha = 0;
    [UIView commitAnimations];
}

// XY方向に平行移動
- (void)translate:(UIView *)view duration:(float)duration movePosition:(float)position
{
    _targetView = view;
    [UIView beginAnimations:ANIM_ID_TRANSLATE context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:duration];
    CGAffineTransform translate = CGAffineTransformMakeTranslation(position, position);
    [_targetView setTransform:translate];
    [UIView commitAnimations];
}

#pragma mark - AnimationDidStop

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    if ([animationID isEqualToString:ANIM_ID_FADE]) {
        if (finished) {
        }
    } else if ([animationID isEqualToString:ANIM_ID_SLIDE]) {
        if (finished) {
        }
    } else if ([animationID isEqualToString:ANIM_ID_ROTATE]) {
        if (finished) {
        }
    } else if ([animationID isEqualToString:ANIM_ID_SCALE]) {
        if (finished) {
        }
    } else if ([animationID isEqualToString:ANIM_ID_SCALE_UP]) {
        if (finished) {
            if (_isBound) {
                [UIView beginAnimations:nil context:nil];
                _targetView.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
                [UIView commitAnimations];
            }
        }
    } else if ([animationID isEqualToString:ANIM_ID_SCALE_DOWN]) {
        if (finished) {
            _targetView.transform = CGAffineTransformMakeScale(1.0, 1.0);
        }
    } else if ([animationID isEqualToString:ANIM_ID_TRANSLATE]) {
        if (finished) {
        }
    }
    if (finished) {
        // ここでデリゲートメソッドを呼ぶ事ができます

    }
}

@end

関連記事

お薦めの参考書

Cocos2d-xスマートフォン2Dゲーム開発講座 Cocos2d-x 3対応
Cocos2d-xを利用したスマートフォン向け3Dゲーム開発の手法を、サンプルを基に作りながら学ぶ事ができます。実際に遊べるゲームサンプルが4種収録されており、iOS / Android両対応のゲームを開発したい方には必見の一冊になっています。

   このエントリーをはてなブックマークに追加

About

Masaki Hirokawa (@dolice_apps)

デザインエンジニア 廣川政樹の開発ブログ。Objective-Cや Javaなど iPhone/Androidアプリ開発に関する技術情報を掲載しています。

iPhone apps

  • リラックス・ヒーリング(無料)
  • 望みが叶う!引き寄せの法則アプリ(無料)
  • ミステリー - 怖い話や不思議な体験、都市伝説まとめ
  • 浮世絵壁紙 - 美しい日本画ギャラリー(無料)
  • 綺麗な壁紙HD iPhone 7/7 Plus/SE & iPod対応(無料)
  • クールな壁紙HD iPhone 7/7 Plus/SE & iPod対応(無料)

Android apps

  • 浮世絵壁紙 - 美しい日本画ギャラリー
  • 綺麗な高画質壁紙

Objective-C Classes

Tag Cloud

ActionScript(9) ActionScript3(7) Ad(4) Adfurikun(2) AdMob(9) Android(10) Animation(17) AppDelegate(3) ARC(1) ArrayList(1) AVAudioPlayer(4) AVAudioSession(1) AVFoundation(3) Banner(2) Bitmap(1) Camera(4) CGAffineTransform(4) CGBlendMode(2) CGContextRef(1) CGImageRef(1) Classes(44) CLLocationManager(1) ConnectivityManager(1) ContentResolver(1) CoreLocation(2) Delegate(3) Device(7) Display(1) DisplayMetrics(1) Download(101) Facebook(6) Foundation(72) Framework(2) Google Analytics(1) Handler(1) iAd(6) ImageView(1) In-AppPurchase(1) iOS(12) iOS 7(15) iOS 7.1(3) iOS 8(1) iPad(7) iPhone(21) iPhone 6(4) Java(7) JavaScript(2) LINE(4) Localize(1) Magazine(1) MediaStore(1) MFComposeViewController(1) Nend(1) NetworkInfo(1) NSArray(23) NSCalendar(3) NSData(2) NSDate(7) NSDateComponents(2) NSDateFormatter(2) NSDictionary(12) NSEnumerator(1) NSIndexSet(1) NSInteger(6) NSMutableArray(17) NSMutableDictionary(5) NSMutableOrderedSet(7) NSMutableString(4) NSMutableURLRequest(1) NSNotificationCenter(1) NSNumber(1) NSObject(1) NSOrderedSet(7) NSRange(2) NSSelectorFromString(1) NSSet(6) NSString(19) NSTimer(4) NSTimeZone(1) NSURL(7) NSURLConnection(1) NSURLRequest(2) NSUserDefaults(7) NSXMLParser(2) Objective-C(222) PHP(1) Products(14) QuartzCore(3) RSS(2) Runnable(1) Sample(51) Screensaver(9) SDK(2) ShareCompat(1) Social(10) StoreKit(1) Twitter(6) UIAccelerometer(3) UIActionSheet(1) UIActivityIndicator(1) UIActivityIndicatorView(3) UIActivityViewController(1) UIAlertView(5) UIApplication(7) UIButton(4) UIColor(3) UIDatePicker(5) UIDevice(6) UIDeviceOrientation(1) UIEvent(6) UIImage(15) UIImagePickerController(4) UIImageView(12) UIKit(58) UILabel(7) UINavigationBar(4) UINavigationItem(1) UIPasteboard(4) UIScreen(1) UIScrollBar(1) UIScrollView(1) UISlider(3) UIStoryboardSegue(3) UISwitch(1) UITabBar(3) UITableView(4) UITextField(2) UIView(11) UIViewAnimationTransition(1) UIViewController(4) UIWebView(5) WindowManager(1) Xcode(48) Xcode 5(8) Xcode 5.1(2)