Skip to content
This repository has been archived by the owner on Jul 11, 2023. It is now read-only.

theguildjp/GLDTween

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GLDTween

GLDTween is a powerful animation library for iOS. It enables you to write complex animation with simple coding.

GLDTweenはiOS用のハンディなアニメーション用ライブラリです。高度なアニメーションを、シンプルかつパワフルに記述できます。

作成の背景

iOSでは「手触り」が重要視されながらも、アニメーションに関するプログラミング資産は不足していました。UIAnimationはAppleの要求するアニメーション品質を実現するにはあまりに貧弱です。一方でCoreAnimationは強力なものの複雑でした。結局のところ、どちらも直感的に表現をコーディングするには向きません。

GLDTweenはこの問題を解決するために開発されました。アニメーションの表現と技術で多くの蓄積があったFlashのノウハウをベースに、ActionScriptの伝説的アニメーションエンジンTweenerをベースに設計されました。シンプルなAPIでパワフルな表現を実現します。

GLDTweenの特徴

シンプルな記法

大抵のアニメーションを1行で記述できます。型変換はライブラリが自動で行うので、CGPointやCATransform3Dなど様々な型を横断する必要がありません。

競合への冗長性

たとえばオブジェクトをアニメーション中に、さらに別のアニメーションを行った場合、GLDTweenは自動で同じプロパティのマージや上書きを行い競合や衝突を防ぎます。

何でもアニメーションできる

GLDTweenのサポートする一般的な数値型であれば、あらゆるプロパティがアニメーション可能です。数値型でさえあれば音楽のボリュームや、ビデオの再生位置すらアニメーション可能です!

高い拡張性

プラグイン方式を採用しているため、ライブラリそのものに手をいれずに独自のカスタマイズができます。アニメーション関数や、特殊な計算を行うプロパティを自分追加できます。

UIや画面の遷移に特化

数個〜数十個のUI要素や画面遷移を行うためのライブラリです。パーティクルのような万単位で同時に動かすアニメには向いていません。

インストール

CocoaPods

CocoaPodsを使っている場合、以下をPodfileに追加します。

pod 'GLDTween', '~> 0.0.1'
GitあるいはZip

通常通りダウンロードやPushでインストールしてください。 ライブラリの依存性としてはQuartzCore.frameworkが必要となります。

例えば、viewの移動をする場合、以下のように1行で書けます。

サンプルコード

GLDTweenでは任意のNSObjectに対し、NSDictionaryでプロパティのアニメーションを指定します。 NSValueを用いてラップをすることで、CGPoint、CGSize、CGRect、CGAffineTransformなどのプロパティも指定可能です。

アニメーションを開始

UIViewを座標(200, 300)に2秒で移動させます。

[GLDTween addTween:myView 
            params:@{@"duration": @2.0, // 時間
                     @"delay": @0.0,
                     @"easing": GLDEasingInOutExpo, // 任意のアニメーションカーブ 
                     @"center": [NSValue valueWithCGPoint:CGPointMake(200, 300)] 
            }];

あるいは標準プラグインの力で、CGPointのかわりにcenterX、centerYでも指定できます。

[GLDTween addTween:myView 
            params:@{@"duration": @2.0, // 時間
                     @"delay": @0.0,
                     @"easing": GLDEasingInOutExpo, // 任意のアニメーションカーブ 
                     @"centerX": @200, // center.xのショートカット
                     @"centerY": @300, // center.yのショートカット
            }];

アニメーションの削除

実行中の任意のNSObjectのアニメーションを削除します。

[GLDTween removeTween:myView];

あるいは特定のプロパティのアニメーションだけ削除することも可能です。

[GLDTween removeTween:myView params:@[@"x", @"width"]];
全てを削除する場合
[GLDTween removeAllTweens];
アニメーションの一次停止と再開除

実行中のアニメーションを一時停止します。

[GLDTween pauseTween:myView];
一時停止中のアニメーションの再開
[GLDTween resumeTween:myView];
全てを一時停止
[GLDTween pauseAllTweens];
全ての一時停止を再開
[GLDTween resumeAllTweens];

複数のアニメーション

複数のプロパティを同時に指定
[GLDTween addTween:myView 
            params:@{@"duration": @2.0, // 時間
                     @"delay": @0.0,
                     @"easing": GLDEasingInOutExpo, // 任意のアニメーションカーブ 
                     @"width": @100,
                     @"height": @100,
                     @"centerX": @200,
                     @"centerY": @300,
                     @"alpha": @0.0
            }];
複数のオブジェクトに同じ動きをさせる。

パラメータの辞書を再利用することで、同じアニメーションを複数のNSObjectに適用できます。

[GLDTween addTween:myView0 params:myDict];
[GLDTween addTween:myView1 params:myDict];
[GLDTween addTween:myView2 params:myDict];
連続でアニメーション

右に1秒移動してから下に1秒移動する。 2つのアニメーションと、delayのパラメータ指定で連続的なアニメーションも記述できる。

// 右に移動
[GLDTween addTween:myView 
            params:@{@"duration": @1.0, // 時間
                     @"delay": @0.0,
                     @"easing": GLDEasingInOutExpo,
                     @"centerX": @200,
            }];
// 下に移動
[GLDTween addTween:myView 
            params:@{@"duration": @1.0, // 時間
                     @"delay": @1.0, // 1.0秒遅延させて実行
                     @"easing": GLDEasingInOutExpo, 
                     @"centerY": @300,
            }];

アニメーションの上書き、競合

同じ時間帯にアニメーションが競合する場合、2つ目のアニメーションへ自動で上書きされます。 下記の2つのアニメーションではXが競合するので、Xのみ2番目のアニメーションが優先されます。

[GLDTween addTween:myView 
            params:@{@"duration": @3.0, // 時間
                     @"delay": @0.0,
                     @"easing": GLDEasingInOutExpo,
                     @"x": @200,
                     @"y": @100,
            }];
[GLDTween addTween:myView 
            params:@{@"duration": @1.5, // 時間
                     @"delay": @1.0,
                     @"easing": GLDEasingInOutExpo, 
                     @"x": @300,
            }];

アニメ開始時、終了時に特殊な処理を行う

ブロックあるいはセレクターで、イベントハンドリングが可能。ただしNSDictionaryに格納するためにGLDTweenBlockあるいは、GLDTweenSelectorでラップする必要がある。

クロージャによるイベント処理
__weak id s = self;
[GLDTween addTween:myView 
            params:@{@"duration": @1.0, // 時間
                     @"delay": @0.0,
                     @"easing": GLDEasingInOutExpo,
                     @"startBlock": [GLDTweenBlock block:^(void){
                          [s animationDidStart:nil]; // ブロック
                     }],
                     @"completionBlock": [GLDTweenBlock block:^(void){
                          [s animationDidComplete:nil]; // ブロック
                     }]
            }];
セレクターによるイベント処理
[GLDTween addTween:myView 
            params:@{@"duration": @1.0, // 時間
                     @"delay": @0.0,
                     @"easing": GLDEasingInOutExpo,
                     @"startSelector": [GLDTweenSelector selector:@selector(animationDidStart:) withTarget:self],
                     @"completionSelector": [GLDTweenSelector selector:@selector(animationDidComplete:) withTarget:self]
            }];

アニメーション中の操作ロック

locksInteraction、unlocksInteractionパラメータで、アニメーション中のユーザー操作をロックできます。

[GLDTween addTween:myView 
            params:@{@"duration": @1.0, // 時間
                     @"delay": @0.0,
                     @"easing": GLDEasingInOutExpo,
                     @"locksInteraction": @YES, // 追加時に操作系をロック
                     @"unlocksInteraction": @YES // 完了 or 削除時に操作系をアンロック
            }];

指定可能なパラメータ

アニメーションのパラメータは、GLDTween.addTweenの第2引数で指定します。第2引数はNSDictionaryで、あらゆるデータ型を内包可能です。

duration: NSNumber
アニメーションの再生時間(秒)
delay: NSNumber
アニメーション開始までの遅延(秒)
transition: NSString
イージングカーブ(後述)の指定
repeat: NSNumber
繰り返し回数。ディフォルトは0。-1を指定した場合は無限ループ。
locksInteraction: BOOL
アニメーション登録時にユーザーインタラクション(タッチ等)をロック。
unlocksInteraction: BOOL
アニメーション完了/削除時に、ユーザーインタラクション(タッチ等)をアンロック。
x: NSNumber
frame.origin.xの省略記法
y: NSNumber
frame.origin.yの省略記法
width: NSNumber
frame.size.widthの省略記法
height: NSNumber
frame.size.heightの省略記法
frame: CGRect
origin: CGPoint
size: CGSize
center: CGPoint
centerX: NSNumber
centerY: NSNumber
startBlock: GLDTweenBlock
アニメーション開始時に実行されるブロック。GLDTweenBlockでラップすること。
completionBlock: GLDTweenBlock
アニメーション開始時に実行されるブロック。GLDTweenBlockでラップすること。
updateBlock: GLDTweenBlock
アニメーション終了時に実行されるブロック。GLDTweenBlockでラップすること。
repeatBlock: GLDTweenBlock
アニメーション終了時に実行されるブロック。GLDTweenBlockでラップすること。
startSelector: GLDTweenSelector
アニメーション開始時に実行されるセレクター。GLDTweenSelectorでラップすること。
completionSelector: GLDTweenSelector
アニメーション更新時に実行されるセレクター。GLDTweenSelectorでラップすること。
updateSelector: GLDTweenSelector
アニメーションリピート時に実行されるセレクター。GLDTweenSelectorでラップすること。
repeatSelector: GLDTweenSelector
アニメーション終了時に実行されるセレクター。GLDTweenSelectorでラップすること。
その他
CGFloat、CGPoint、CGSize、CGRect、CGAffineTransform、CATransform3D型のプロパティはそのまま指定可能(例えばalpha等)。

対応プロパティ・データタイプ

アニメーション対象として指定したNSObjectサブクラスから、valueForKeyで取得できる下記型のプロパティに対応しています。またNSObjectを拡張した場合、これらの型の値を返す全てのGetter/Setterもアニメーション可能です。

CGFloat
UIView.alpha等
CGPoint
UIView.center、CALayer.position等
CGSize
UIScrollView.contentSize等
CGRect
UIView.frame等
CGAffineTransform
UIView.transform等
CATranform3D
CALayer.transform等
UIColor(対応予定)
UIView.backgroundColor等

指定可能なアニメーションカーブ

いわゆるRobert Pennerによる主要アニメーションカーブは全てサポートしています。

  • GLDEasingNone
  • GLDEasingInSine
  • GLDEasingOutSine
  • GLDEasingInOutSine
  • GLDEasingInQuad
  • GLDEasingOutQuad
  • GLDEasingInOutQuad
  • GLDEasingInCubic
  • GLDEasingOutCubic
  • GLDEasingInOutCubic

プラグインの作成

GLDTweenでは以下の2種類のプラグインを作成可能です。 プラグインの作成方法は後述します。

アニメーション・カーブ
GLDEasingFunctionテンプレートクラスを継承することで、自身で定義したオリジナルのアニメーションカーブを登録できます。
独自プロパティ
GLDSpecialPropertyを継承したアダプタクラスを作ることで、GLDTweenプリセットの対応プロパティだけでなく、様々なプロパティに対応可能です。

対応予定機能

  • オートリバース

TODO

  • コントリビュータを集める
  • サンプルコードを作る
  • TestCaseを書く

Known Issues

  • Swiftから使用する場合、GLDTweenSelectorによるコールバックが正常に作動しません。現段階ではGLDTweenBlockを使用してください。