クロックを作ってみた(2)

2010. 03. 07
●ビューの回転

3x3行列のアフィン変換は二次元平面での回転、拡大縮小、平行移動する方法です。

CGAffineTransformMakeメソッドは、回転や拡大縮小などの座標変換した行列のCGAffineTransform構造体を生成して返します。

CGAffineTransformMake6つの引数でアフィン変換行列を作ります
CGAffineTransformMakeRotation角度(ラジアン単位)を引数にビューを回転させます
CGAffineTransformMakeScalex、yの拡大率を引数に、ビューを拡大縮小させます 
CGAffineTransformMakeTranslationx、yのピクセル数を引数に、ビューを平行移動させます

●アラーム機能の追加

章末のコードリストには有りますが、説明の本文中にsetAlarmItemsメソッドの宣言が抜けていますので、追加しましょう。

- (void)setAlarmItems;

●タッチ座標の取得

NSSet *touches = [event touchesForView:sender];

UIEventクラスのインスタンスメソッドは3つあります。

- allTouchesレシーバに関連付けられた全てのタッチオブジェクトを返します
- touchesForView:特定ビューのタッチオブジェクトをレシーバに返します
- touchesForWindows:特定ウィンドウのタッチオブジェクトをレシーバに返します

ここではAlarmHandの操作、すなわちViewに対するTouch DownおよびTouch Drag Inside双方のイベントをNSSetクラスのtouches変数に返します。

NSSetクラスはオブジェクトの集合を表すクラスで、複数イベントを取り纏めるものです。

UITouch *touch = [touches anyObject];

複数イベントが格納されているtouchesから、anyObjectメソッドでイベントを1つ拾い上げ、タッチイベントの情報(タップ回数や座標など)をUITouchクラスのtouch変数に渡します。

CGPoint touchPoint = [touch locationInView:sender];

タッチイベントの情報からlocationInViewメソッドで、ビューの座標をtouchPoint変数に返します。

●アラーム音の準備

これまでのスマッシュバランスでは、UFOの爆発音やボールがフレームに当たった際の衝突音というSEでしたので、実装の容易なSystem Sound Services(AudioToolbox.frameworkのAudioServices.h)を利用していました。

今回は時計のアラーム機能ですので、止めるまでループ再生を行う都合上System Sound Servicesを使えませんので、AV AudioPlayerクラスを使っています。

Core Audio系サービスの中で、Objective-Cインターフェイスで扱える比較的簡易な方法です。

ステレオの定位や正確な同期、ストリーム再生はできませんが、ループ再生や複数サウンドの同時再生などが可能です。

alarmPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

[AVAudioPlayer alloc]でAVAudioPlayerのインスタンスを生成し、initWithContentsOfURL:urlで先に設定したアラーム用オーディオファイルの場所を渡します。

error:nilは、初期化に失敗した際のエラーコードを返します。

●ユーザ・デフォルトの処理

NSUserDefaultsクラスは、アプリケーション終了後も設定値を保持するオートセーブ機能のようなニュアンスで書かれていますが、どちらかと言うとアプリケーションの環境設定として使われます。

登録内容はプロパティリスト形式で保存されます。

あまり詳しくないプロパティリストの解説は『Xcodeのプロパティリストエディタ』を参照してください

このプロパティリストの保存先は、tAkatronixさんの『[iPhone]設定値を保存する NSUserDefaults』に説明されています。

ちなみに、今回のクロックのプロパティリストはこうなっています。

194

ユーザデフォルトのインスタンスから『- ~ForKey:』で設定値が取得できます。

- arrayForKey:通常配列(NSArray)を取得します
- boolForKey:ブール値(BOOL)を取得します
- dataForKey:データオブジェクト(NSData)を取得します
- dictionaryForKey:連想配列オブジェクト(NSDictionary)を取得します
- floatForKey:単精度浮動小数点実数値(float)を取得します
- integerForKey:整数値(NSInteger)を取得します
- objectForKey:オブジェクト(id)を取得します
- stringArrayForKey:文字列配列(NSArray)を取得します
- stringForKey:文字列を(NSString)取得します
- doubleForKey:倍精度浮動小数点実数値(double)を取得します

値の設定には『- set~:forKey:』を使います。

- setBool:forKey:ブール値(BOOL)を設定します
- setFloat:forKey:単精度浮動小数点実数値(float)を設定します
- setInteger:forKey:整数値(NSInteger)を設定します
- setObject:forKey:オブジェクト(id)を設定します
- setDouble:forKey:倍精度浮動小数点実数値(double)を設定します

※2010.4.12修正
『設定』とすべきところを『取得』と記載していましたので修正しました

環境設定値を保存するにあたり、ビューが閉じた際のメソッド(viewWillDisappear)を追加していますが、ビューイベントに対するメソッドは他にも有ります。

- viewWillAppear:ビューが表示する前の処理
- viewDidAppear:ビューが表示された後の処理
- viewWillDisappear:ビューが非表示または解放になる前の処理
- viewDidDisappear:ビューが非表示または解放された後の処理

環境設定値の初期化に際し、NSUserDefaultsクラスのregisterDefaults:メソッドを使っていますが、引数がNSDictionaryクラスのオブジェクトになっています。

NSDictionaryは配列の一種ですが、
・配列を構成する要素を連番で管理するものを通常配列(NSArray)
・キーワードを目印にして管理するものを連想配列(NSDictionary)
と呼びます。

環境設定値はキーとキー値を保存したいので連想配列を使います。

また今回の環境設定値は、アラームのON/OFFと設定時刻で随時変更されるものですので、固定値用のNSDictionaryではなく、可変長のNSMutableDictionaryを使います。

 通常配列連想配列
固定NSArrayNSDictionary
可変NSMutableArrayNSMutableDictionary

NSMutableDictionaryへの要素の追加

- setObject:forKey:オブジェクトのキー(id)と値(id)のペアを追加します
- setValue:forKey:文字列のキー(NSString)とオブジェクトの値(id)のペアを追加します
- addEntriesFromDictionary:他の辞書(NSDictionary)を追加します。
キーが同じ場合は値が上書きされます。 
- setDictionary:他の辞書(NSDictionary)を設定(置換)します

要素の値はオブジェクトである必要がある為、BOOL値や実数値はオブジェクト(NSNumber)に置き換えなければなりません。



参考文献

iOSアプリケーションプログラミングガイド

CGAffineTransform Reference

UIEvent Class Reference

NSSet Class Reference

UITouch Class Reference

NSUserDefaults Class Reference

UIViewController Class Reference

福井高専IT研究会OfficialWiki

Core Audioの概要

tAkatronix's GEEEK notes

@IT/Cocoaの素、Objective-Cを知ろう/第5回 配列とループ処理を理解しよう

混沌のiPoneアプリケーション工房/NSMutableDictionaryについて

iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩
(2009/03/18)
赤松 正行

商品詳細を見る

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る






Wave SoundTouch music system IV
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 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 - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Wave SoundTouch music system IV
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR