スライドショーの簡易アニメーション(1)
2010. 06. 21
今度はステータスバーの透明化とツールバーの移動、ならびにトリプルタップ時のビューの回転機能のアニメーションをアプリケーションに追加します。
●フルスクリーン化時のステータスバーとツールバーのアニメーション
前述の通り、シングルタップした際のフルスクリーン化のON/OFF時に、
・ステータスバーの透明化
・(下方向へ画面外への)ツールバーの移動
の2つのアニメーション機能を、SlideクラスにenterOrExitFullScreenWithAnimationメソッドとして追加します。
●Slide.hヘッダファイルの編集
本書では触れられていませんが、Slide.hヘッダファイルにenterOrExitFullScreenWithAnimationの宣言するのを忘れないでください。
(太字が追加した部分)
●Slide.mソースファイルの編集
・setAnimationsEnabled:
(UIViewクラス)
+ (void)setAnimationsEnabled:(BOOL)enabled
アニメーションを有効にするかどうかの設定をします。
アニメーションの属性を変更すると、アニメーションが無効になって無視されます。
デフォルトではアニメーションは有効になっています。
enabled:YESの場合はアニメーションは有効に、NOの場合は無効になります。
・beginAnimations:context:
(UIViewクラス)
+ (void)beginAnimations:(NSString *)animationID context:(void *)context
アニメーションブロックを開始します。
アニメーションブロック内でいくつかのプロパティ値を設定することにより、視覚的な変更をアニメーションすることができます。
アニメーションブロックはネスト(入れ子)にすることができます。
setAnimation~クラスメソッドが無い場合、アニメーションブロック内では何も呼び出しません。
アニメーションブロックは、beginAnimations:context:で開始され、commitAnimationクラスメソッドで終了します。
animationID:アニメーションデリゲートメッセージに渡すため、アプリケーションが供給するブロック内のアニメーションの識別子です。
セレクタの設定では、setAnimationWillStartSelector:とsetAnimationDidStopSelector:メソッドを使います。
context:アニメーションデリゲートメッセージに渡すため、アプリケーションが供給するブロック内の追加情報です。
セレクタの設定では、setAnimationWillStartSelector:とsetAnimationDidStopSelector:メソッドを使います。
・center
(UIViewクラス)
@property(nonatomic) CGPoint center
フレームの中心です。
スーパービューの座標系内の中央を指定します。
このプロパティの設定を変更すると、それに応じてframeプロパティの値が変わります。
フレーム矩形を変更すると、drawRect:メソッドの呼び出し無しにレシーバを自動的に再表示します。
フレーム矩形の変更時にdrawRect:メソッドを呼び出したい場合は、UIViewContentModeRedrawにcontentModeプロパティを設定してください。
このプロパティを変更して、アニメーションをすることができます。
アニメーションブロックで、開始にはbeginAnimations:context:クラスメソッド、終了にはcommitAnimationsクラスメソッドを使います。
・CGRectGetHeight
(CGGeometry)
CGFloat CGRectGetHeight (
CGRect rect
);
矩形の高さを返します。
CGRectデータ構造体の格納している数値の正負に関わらず、この関数は標準かした矩形の高さを返します。
したがって、結果が負の数になることはありません。
rect:調べる矩形を指定します。
・alpha
(UIViewクラス)
@property(nonatomic) CGFloat alpha
レシーバのアルファ値です。
このプロパティを変更して、アニメーションをすることができます。
アニメーションブロックで、開始にはbeginAnimations:context:クラスメソッド、終了にはcommitAnimationsクラスメソッドを使います。
・commitAnimations
(UIViewクラス)
+ (void)commitAnimations
このアニメーションブロックが外側の時、アニメーションブロックの終了を示し、アニメーションを開始します。
現在のアニメーションブロックが外側のアニメーションブロックの場合、アプリケーションの実行ループに返される時にアニメーションが開始します。
アプリケーションはブロックされないため、アニメーションの実行は別のスレッドで行われます。
この場合、複数のアニメーションを互いの上に積み重ねることができます。
アニメーション開始の他の方法については、setAnimationBeginsFromCurrentState:を参照してください。
・setStatusBarHidden:animated:
(UIApplicationクラス)
- (void)setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated
ステータスバーの非表示または表示、任意で変化をアニメーションできます。
(このメソッドはiPhone OS 3.2では非推奨。iPhone OS 3.2では、代わりにsetStatusBarHidden:withAnimation:を使用してください。)
hiddenの値によって、インターフェイスの上部にステータスバーを外または中にフェードするアニメーションを行うことができます。
hidden:YESの場合はステータスバーを非表示に、NOの場合は表示になります。
デフォルト値はNOになります。
animated:YESの場合は非表示状態からアニメーションで変化し、NOではアニメーションしません。
●CGGeometry
CGGeometryリファレンスは、幾何学的な原型とその操作を行う構造体を定義します。
CGPointデータ構造体は、二次元座標系の点を表します。
CGRectデータ構造体は、矩形の位置と大きさを表します。
CGSizeデータ構造体は、幅と高さの大きさを表します。
CGRectデータ構造体に格納される高さと幅は、負の値でも格納できます。
例えば、矩形の原点が (0.0 , 0.0) でサイズが (10.0 , 10.0) のものと、矩形の原点が (10.0 , 10.0) でサイズが (-10.0 , -10.0) のものは全く同一になります。
アプリケーションはCGRectStandardize関数を呼び出して、矩形を標準化する(格納している高さと幅を正の値にする)ことができます。
このリファレンスで述べている全ての関数は、CGRectデータ構造体で入力された場合には暗黙的に標準化してから矩形の計算を行います。
その理由は、CGRectデータ構造体に格納されているデータの読み書きを、アプリケーションが直接行うことを避けるためです。
代わりにここでは、矩形の操作とその特質を取得する関数の使い方を表します。
参考文献
・UIView Class Reference
・CGGeometry Reference
・UIApplication Class Reference
●フルスクリーン化時のステータスバーとツールバーのアニメーション
前述の通り、シングルタップした際のフルスクリーン化のON/OFF時に、
・ステータスバーの透明化
・(下方向へ画面外への)ツールバーの移動
の2つのアニメーション機能を、SlideクラスにenterOrExitFullScreenWithAnimationメソッドとして追加します。
●Slide.hヘッダファイルの編集
本書では触れられていませんが、Slide.hヘッダファイルにenterOrExitFullScreenWithAnimationの宣言するのを忘れないでください。
(太字が追加した部分)
#import <Foundation/Foundation.h>
@interface Slide : NSObject {
// アウトレット
IBOutlet UIImageView *imageSlide; // 画像表示
IBOutlet UIToolbar *toolbar; // ツールバー
IBOutlet UISlider *sliderDuration; // 長さ変更
IBOutlet UISegmentedControl *segShuffle; //シャッフル
IBOutlet UIButton *btnStartStop; // 開始ボタン
}
// アクション
- (IBAction)startStop:(id)sender; // スライドショーの開始停止
- (IBAction)changeOrder:(id)sender; // スライドショーのシャッフル
- (IBAction)changeDuration:(id)sender; // スライドショーの長さの変更
- (void)enterOrExitFullScreen;
- (void)enterOrExitFullScreenWithAnimation;
@end
@interface Slide : NSObject {
// アウトレット
IBOutlet UIImageView *imageSlide; // 画像表示
IBOutlet UIToolbar *toolbar; // ツールバー
IBOutlet UISlider *sliderDuration; // 長さ変更
IBOutlet UISegmentedControl *segShuffle; //シャッフル
IBOutlet UIButton *btnStartStop; // 開始ボタン
}
// アクション
- (IBAction)startStop:(id)sender; // スライドショーの開始停止
- (IBAction)changeOrder:(id)sender; // スライドショーのシャッフル
- (IBAction)changeDuration:(id)sender; // スライドショーの長さの変更
- (void)enterOrExitFullScreen;
- (void)enterOrExitFullScreenWithAnimation;
@end
●Slide.mソースファイルの編集
- (void)enterOrExitFullScreenWithAnimation {
// ビューのアニメーションを有効化
[UIView setAnimationsEnabled:YES];
// アニメーション定義ブロックの開始
[UIView beginAnimations:@"FullScreen" context:nil];
// 現在のビューの中心位置を取得
CGPoint center = toolbar.center;
// 現在のビューの矩形と高さを取得
CGRect frame = toolbar.frame;
CGFloat height = CGRectGetHeight(frame);
// 不透明の時は透明化して下に移動
if (toolbar.alpha == 1.0f) {
toolbar.alpha = 0.0f;
center.y += height;
}
// 透明の時は不透明化して上に移動
else {
toolbar.alpha = 1.0f;
center.y -= height;
}
// 中心位置を変更
toolbar.center = center;
// アニメーション実行
[UIView commitAnimations];
// ステータスバーのアニメーション
UIApplication *app = [UIApplication sharedApplication];
[app setStatusBarHidden:! app.statusBarHidden animated:YES];
}
// ビューのアニメーションを有効化
[UIView setAnimationsEnabled:YES];
// アニメーション定義ブロックの開始
[UIView beginAnimations:@"FullScreen" context:nil];
// 現在のビューの中心位置を取得
CGPoint center = toolbar.center;
// 現在のビューの矩形と高さを取得
CGRect frame = toolbar.frame;
CGFloat height = CGRectGetHeight(frame);
// 不透明の時は透明化して下に移動
if (toolbar.alpha == 1.0f) {
toolbar.alpha = 0.0f;
center.y += height;
}
// 透明の時は不透明化して上に移動
else {
toolbar.alpha = 1.0f;
center.y -= height;
}
// 中心位置を変更
toolbar.center = center;
// アニメーション実行
[UIView commitAnimations];
// ステータスバーのアニメーション
UIApplication *app = [UIApplication sharedApplication];
[app setStatusBarHidden:! app.statusBarHidden animated:YES];
}
・setAnimationsEnabled:
(UIViewクラス)
+ (void)setAnimationsEnabled:(BOOL)enabled
アニメーションを有効にするかどうかの設定をします。
アニメーションの属性を変更すると、アニメーションが無効になって無視されます。
デフォルトではアニメーションは有効になっています。
enabled:YESの場合はアニメーションは有効に、NOの場合は無効になります。
・beginAnimations:context:
(UIViewクラス)
+ (void)beginAnimations:(NSString *)animationID context:(void *)context
アニメーションブロックを開始します。
アニメーションブロック内でいくつかのプロパティ値を設定することにより、視覚的な変更をアニメーションすることができます。
アニメーションブロックはネスト(入れ子)にすることができます。
setAnimation~クラスメソッドが無い場合、アニメーションブロック内では何も呼び出しません。
アニメーションブロックは、beginAnimations:context:で開始され、commitAnimationクラスメソッドで終了します。
animationID:アニメーションデリゲートメッセージに渡すため、アプリケーションが供給するブロック内のアニメーションの識別子です。
セレクタの設定では、setAnimationWillStartSelector:とsetAnimationDidStopSelector:メソッドを使います。
context:アニメーションデリゲートメッセージに渡すため、アプリケーションが供給するブロック内の追加情報です。
セレクタの設定では、setAnimationWillStartSelector:とsetAnimationDidStopSelector:メソッドを使います。
・center
(UIViewクラス)
@property(nonatomic) CGPoint center
フレームの中心です。
スーパービューの座標系内の中央を指定します。
このプロパティの設定を変更すると、それに応じてframeプロパティの値が変わります。
フレーム矩形を変更すると、drawRect:メソッドの呼び出し無しにレシーバを自動的に再表示します。
フレーム矩形の変更時にdrawRect:メソッドを呼び出したい場合は、UIViewContentModeRedrawにcontentModeプロパティを設定してください。
このプロパティを変更して、アニメーションをすることができます。
アニメーションブロックで、開始にはbeginAnimations:context:クラスメソッド、終了にはcommitAnimationsクラスメソッドを使います。
・CGRectGetHeight
(CGGeometry)
CGFloat CGRectGetHeight (
CGRect rect
);
矩形の高さを返します。
CGRectデータ構造体の格納している数値の正負に関わらず、この関数は標準かした矩形の高さを返します。
したがって、結果が負の数になることはありません。
rect:調べる矩形を指定します。
・alpha
(UIViewクラス)
@property(nonatomic) CGFloat alpha
レシーバのアルファ値です。
このプロパティを変更して、アニメーションをすることができます。
アニメーションブロックで、開始にはbeginAnimations:context:クラスメソッド、終了にはcommitAnimationsクラスメソッドを使います。
・commitAnimations
(UIViewクラス)
+ (void)commitAnimations
このアニメーションブロックが外側の時、アニメーションブロックの終了を示し、アニメーションを開始します。
現在のアニメーションブロックが外側のアニメーションブロックの場合、アプリケーションの実行ループに返される時にアニメーションが開始します。
アプリケーションはブロックされないため、アニメーションの実行は別のスレッドで行われます。
この場合、複数のアニメーションを互いの上に積み重ねることができます。
アニメーション開始の他の方法については、setAnimationBeginsFromCurrentState:を参照してください。
・setStatusBarHidden:animated:
(UIApplicationクラス)
- (void)setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated
ステータスバーの非表示または表示、任意で変化をアニメーションできます。
(このメソッドはiPhone OS 3.2では非推奨。iPhone OS 3.2では、代わりにsetStatusBarHidden:withAnimation:を使用してください。)
hiddenの値によって、インターフェイスの上部にステータスバーを外または中にフェードするアニメーションを行うことができます。
hidden:YESの場合はステータスバーを非表示に、NOの場合は表示になります。
デフォルト値はNOになります。
animated:YESの場合は非表示状態からアニメーションで変化し、NOではアニメーションしません。
●CGGeometry
CGGeometryリファレンスは、幾何学的な原型とその操作を行う構造体を定義します。
CGPointデータ構造体は、二次元座標系の点を表します。
CGRectデータ構造体は、矩形の位置と大きさを表します。
CGSizeデータ構造体は、幅と高さの大きさを表します。
CGRectデータ構造体に格納される高さと幅は、負の値でも格納できます。
例えば、矩形の原点が (0.0 , 0.0) でサイズが (10.0 , 10.0) のものと、矩形の原点が (10.0 , 10.0) でサイズが (-10.0 , -10.0) のものは全く同一になります。
アプリケーションはCGRectStandardize関数を呼び出して、矩形を標準化する(格納している高さと幅を正の値にする)ことができます。
このリファレンスで述べている全ての関数は、CGRectデータ構造体で入力された場合には暗黙的に標準化してから矩形の計算を行います。
その理由は、CGRectデータ構造体に格納されているデータの読み書きを、アプリケーションが直接行うことを避けるためです。
代わりにここでは、矩形の操作とその特質を取得する関数の使い方を表します。
参考文献
・UIView Class Reference
・CGGeometry Reference
・UIApplication Class Reference
基礎からのiOS SDK (2010/10/09) 鶴薗 賢吾、松浦 健一郎 他 商品詳細を見る |