スライドショーのメソッド(1)
2010. 06. 11
『基礎からのiPhone SDK 改訂版』の『スライドショーの作成』のメソッドを説明します。
今回のスライドショーで実装しているメソッドは5つあります。
1)animationImages(画像配列の生成メソッド)
2)awakeFromNib(初期化メソッド)
3)startStop:sender:(Start/Stopボタンのアクションメソッド)
4)changeDuration:sender:(速度切り替えバーのアクションメソッド)
5)changeOrder:sender:(モード変更ボタンのアクションメソッド)
●画像配列の生成メソッド
※2010.6.12訂正
この生成メソッドanimationImagesと、UIImageViewクラスのanimationImagesプロパティは別物です。
(何故わざわざ既存のプロパティと同名のユーザメソッドにしたのか不明ですが)
内容としては、まずimageNamed:でスライドショーに使う画像7枚をオブジェクトにし、arrayWithObjects:で配列にします。
表示モードの判別は、セグメンテッドコントロールのアウトレットであるsegShuffleのインデックスを取得して行います。
※2010.6.12追記
selectedSegmentIndexプロパティの項目を追加しました。
シャッフルモードの場合は、疑似ランダム値を現在時刻を使ってランダム値を作っています。
疑似ランダム値をランダム値に近づけるために、C言語の標準ライブラリ関数のsrand関数(void srand(unsigned))を使い、引数に現在の時刻を渡してランダム値生成用のシード(種)を作ります。
そして、rand関数(int rand(void))でランダム値を2つ生成し、画像配列の要素数countで割って、剰余を求めることで0~(要素数-1)の値を得ます。
求めた2つのランダム値を使って、exchangeObjectAtIndex:withObjectAtIndex:メソッドで要素を入れ替えてシャッフルを実現しています。
・imageNamed:
(UIImageクラス)
+ (UIImage *)imageNamed:(NSString *)name
指定したファイル名に関連付けされた画像オブジェクトを返します。
指定したファイルの画像オブジェクト、またはメソッドが指定した画像が見つけられなかった場合はnilを返します。
このメソッドは、指定した名前の画像オブジェクトをシステムキャッシュの中から探し、存在するオブジェクトを返します。
一致する画像オブジェクトが既にキャッシュに存在しない場合、このメソッドは指定したファイルを画像データから読み込み、キャッシュして、結果のオブジェクトを返します。
name:拡張子を含むファイル名を指定します。
この画像を初めて読み込む場合、このメソッドはアプリケーションのメインバンドルから、指定した名前の画像を検索します。
・arrayWithObjects:
(NSArrayクラス)
+ (id)arrayWithObjects:(id)firstObj, ...
引数リストのオブジェクトを含む配列を生成して返します。
以下に3つの異なる型の要素を含む配列を生成するコードの例を示します。
firstObj, ...:コンマ区切りで、終端をnilにしたオブジェクトのリストを指定します。
・selectedSegmentIndex
(UISegmentedControlクラス)
@property(nonatomic) NSInteger selectedSegmentIndex
(最後にタッチして)選択したセグメントを識別するインデックス番号。
デフォルト値は、ユーザがセグメントをタッチするまで、UISegmentedControlNoSegment(セグメントを選択していない状態)になります。
-1を設定すると、現在の選択が解除されます。
UISegmentedControlのコントロールが瞬間的なモードの時、このプロパティは無視されます。
ユーザがセグメントをタッチして選択を変えると、コントロールイベントUIControlEventValueChangedを生成します。
セグメンテッドコントロールがこのコントロールイベントに応答するようにセットアップされている場合は、ターゲットにアクションメッセージが送られます。
・count
(NSArrayクラス)
- (NSUInteger)count
レシーバの現在のオブジェクト数を返します。
・date
(NSDateクラス)
+ (id)date
現在の日付と時間の新しい日付セットを生成して返します。
このメソッドはデフォルトの初期化メソッドとして、このクラスのinitを使用します。
以下にdateメソッドを使用した、現在時刻を取得するサンプルコードを示します。
・timeIntervalSinceReferenceDate
(NSDateクラス)
- (NSTimeInterval)timeIntervalSinceReferenceDate
2001年1月1日 GMTからレシーバまでの経過秒数を返します。
レシーバとシステムの絶対参照日(2001年1月1日 GMT)の間隔を返します。
レシーバが絶対参照日以前の場合、戻り値は負になります。
・exchangeObjectAtIndex:withObjectAtIndex:
(NSMutableArrayクラス)
- (void)exchangeObjectAtIndex:(NSUInteger)idx1withObjectAtIndex:(NSUInteger)idx2
指定したインデックスで、レシーバのオブジェクトを交換します。
idx1:idx2で指定したオブジェクトと入れ替えるオブジェクトのインデックスを指定します。
idx2:idx1で指定したオブジェクトと入れ替えるオブジェクトのインデックスを指定します。
参考文献
・UIImage Class Reference
・NSArray Class Reference
・UISegmentedControl Class Reference
・NSDate Class Reference
・NSMutableArray Class Reference
今回のスライドショーで実装しているメソッドは5つあります。
1)animationImages(画像配列の生成メソッド)
2)awakeFromNib(初期化メソッド)
3)startStop:sender:(Start/Stopボタンのアクションメソッド)
4)changeDuration:sender:(速度切り替えバーのアクションメソッド)
5)changeOrder:sender:(モード変更ボタンのアクションメソッド)
●画像配列の生成メソッド
- (NSArray *)animationImages {
// 画像リソースの読み込み
UIImage *img1 = [UIImage imageNamed:@"photo08.jpg"];
UIImage *img2 = [UIImage imageNamed:@"photo09.jpg"];
UIImage *img3 = [UIImage imageNamed:@"photo10.jpg"];
UIImage *img4 = [UIImage imageNamed:@"photo11.jpg"];
UIImage *img5 = [UIImage imageNamed:@"photo12.jpg"];
UIImage *img6 = [UIImage imageNamed:@"photo13.jpg"];
UIImage *img7 = [UIImage imageNamed:@"photo14.jpg"];
// 画像順の配列の生成
NSMutableArray *imgs = [NSMutableArray arrayWithObjects:img1, img2, img3, img4, img5, img6, img7, nil];
// 表示順が画像順かシャッフルか判定
if (segShuffle.selectedSegmentIndex ==1) {
int i;
// 配列の個数を取得
int count = [imgs count];
// 現在の日時で乱数のシード値を変更
srand([[NSDate date] timeIntervalSinceReferenceDate]);
for (i = 0; i < 10; i++) {
// 乱数の生成
NSUInteger pos1 = rand() % count;
NSUInteger pos2 = rand() % count;
// 要素の入れ替え
[imgs exchangeObjectAtIndex:pos1 withObjectAtIndex:pos2];
}
}
// 配列を返す
return(imgs);
}
// 画像リソースの読み込み
UIImage *img1 = [UIImage imageNamed:@"photo08.jpg"];
UIImage *img2 = [UIImage imageNamed:@"photo09.jpg"];
UIImage *img3 = [UIImage imageNamed:@"photo10.jpg"];
UIImage *img4 = [UIImage imageNamed:@"photo11.jpg"];
UIImage *img5 = [UIImage imageNamed:@"photo12.jpg"];
UIImage *img6 = [UIImage imageNamed:@"photo13.jpg"];
UIImage *img7 = [UIImage imageNamed:@"photo14.jpg"];
// 画像順の配列の生成
NSMutableArray *imgs = [NSMutableArray arrayWithObjects:img1, img2, img3, img4, img5, img6, img7, nil];
// 表示順が画像順かシャッフルか判定
if (segShuffle.selectedSegmentIndex ==1) {
int i;
// 配列の個数を取得
int count = [imgs count];
// 現在の日時で乱数のシード値を変更
srand([[NSDate date] timeIntervalSinceReferenceDate]);
for (i = 0; i < 10; i++) {
// 乱数の生成
NSUInteger pos1 = rand() % count;
NSUInteger pos2 = rand() % count;
// 要素の入れ替え
[imgs exchangeObjectAtIndex:pos1 withObjectAtIndex:pos2];
}
}
// 配列を返す
return(imgs);
}
※2010.6.12訂正
この生成メソッドanimationImagesと、UIImageViewクラスのanimationImagesプロパティは別物です。
(何故わざわざ既存のプロパティと同名のユーザメソッドにしたのか不明ですが)
内容としては、まずimageNamed:でスライドショーに使う画像7枚をオブジェクトにし、arrayWithObjects:で配列にします。
表示モードの判別は、セグメンテッドコントロールのアウトレットであるsegShuffleのインデックスを取得して行います。
※2010.6.12追記
selectedSegmentIndexプロパティの項目を追加しました。
シャッフルモードの場合は、疑似ランダム値を現在時刻を使ってランダム値を作っています。
疑似ランダム値をランダム値に近づけるために、C言語の標準ライブラリ関数のsrand関数(void srand(unsigned))を使い、引数に現在の時刻を渡してランダム値生成用のシード(種)を作ります。
そして、rand関数(int rand(void))でランダム値を2つ生成し、画像配列の要素数countで割って、剰余を求めることで0~(要素数-1)の値を得ます。
求めた2つのランダム値を使って、exchangeObjectAtIndex:withObjectAtIndex:メソッドで要素を入れ替えてシャッフルを実現しています。
・imageNamed:
(UIImageクラス)
+ (UIImage *)imageNamed:(NSString *)name
指定したファイル名に関連付けされた画像オブジェクトを返します。
指定したファイルの画像オブジェクト、またはメソッドが指定した画像が見つけられなかった場合はnilを返します。
このメソッドは、指定した名前の画像オブジェクトをシステムキャッシュの中から探し、存在するオブジェクトを返します。
一致する画像オブジェクトが既にキャッシュに存在しない場合、このメソッドは指定したファイルを画像データから読み込み、キャッシュして、結果のオブジェクトを返します。
name:拡張子を含むファイル名を指定します。
この画像を初めて読み込む場合、このメソッドはアプリケーションのメインバンドルから、指定した名前の画像を検索します。
・arrayWithObjects:
(NSArrayクラス)
+ (id)arrayWithObjects:(id)firstObj, ...
引数リストのオブジェクトを含む配列を生成して返します。
以下に3つの異なる型の要素を含む配列を生成するコードの例を示します。
NSArray *myArray;
NSDate *aDate = [NSDate distantFuture];
NSValue *aValue = [NSNumber numberWithInt:5];
NSString *aString = @"a string";
myArray = [NSArray arrayWithObjects:aDate, aValue, aString, nil];
NSDate *aDate = [NSDate distantFuture];
NSValue *aValue = [NSNumber numberWithInt:5];
NSString *aString = @"a string";
myArray = [NSArray arrayWithObjects:aDate, aValue, aString, nil];
firstObj, ...:コンマ区切りで、終端をnilにしたオブジェクトのリストを指定します。
・selectedSegmentIndex
(UISegmentedControlクラス)
@property(nonatomic) NSInteger selectedSegmentIndex
(最後にタッチして)選択したセグメントを識別するインデックス番号。
デフォルト値は、ユーザがセグメントをタッチするまで、UISegmentedControlNoSegment(セグメントを選択していない状態)になります。
-1を設定すると、現在の選択が解除されます。
UISegmentedControlのコントロールが瞬間的なモードの時、このプロパティは無視されます。
ユーザがセグメントをタッチして選択を変えると、コントロールイベントUIControlEventValueChangedを生成します。
セグメンテッドコントロールがこのコントロールイベントに応答するようにセットアップされている場合は、ターゲットにアクションメッセージが送られます。
・count
(NSArrayクラス)
- (NSUInteger)count
レシーバの現在のオブジェクト数を返します。
・date
(NSDateクラス)
+ (id)date
現在の日付と時間の新しい日付セットを生成して返します。
このメソッドはデフォルトの初期化メソッドとして、このクラスのinitを使用します。
以下にdateメソッドを使用した、現在時刻を取得するサンプルコードを示します。
NSDate *today = [NSDate date];
・timeIntervalSinceReferenceDate
(NSDateクラス)
- (NSTimeInterval)timeIntervalSinceReferenceDate
2001年1月1日 GMTからレシーバまでの経過秒数を返します。
レシーバとシステムの絶対参照日(2001年1月1日 GMT)の間隔を返します。
レシーバが絶対参照日以前の場合、戻り値は負になります。
・exchangeObjectAtIndex:withObjectAtIndex:
(NSMutableArrayクラス)
- (void)exchangeObjectAtIndex:(NSUInteger)idx1withObjectAtIndex:(NSUInteger)idx2
指定したインデックスで、レシーバのオブジェクトを交換します。
idx1:idx2で指定したオブジェクトと入れ替えるオブジェクトのインデックスを指定します。
idx2:idx1で指定したオブジェクトと入れ替えるオブジェクトのインデックスを指定します。
参考文献
・UIImage Class Reference
・NSArray Class Reference
・UISegmentedControl Class Reference
・NSDate Class Reference
・NSMutableArray Class Reference
![]() | 基礎からのiOS SDK (2010/10/09) 鶴薗 賢吾、松浦 健一郎 他 商品詳細を見る |