3本指のピンチジェスチャーを作る 1

画像の拡大縮小で頻繁にピンチジェスチャー(UIPinchGestureRecognizer)を使うと思いますが、
通常の2本指ではなく3本指で操作したいと思いカスタムジェスチャーを作ってみました。

その作り方を公開したいと思います。

ジェスチャーの仕様は次の通り
・クラス名は ThreeFingersPinchGestureRecognizer
・3本指でジェスチャーを認識し始める
・3点間の距離の合計が変化した割合をプロパティ scale として示す

まずは、カスタムジェスチャーの基本から
カスタムジェスチャーの作り方は意外と簡単で、UIGestureRecognizer を継承して下記の5メソッドをオーバーライドすればOK

- (void)reset;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

それぞれ必要なことは

reset
ジェスチャーの状態を初期状態に戻す。
今回の実装ではプロパティscaleを初期値に戻します。

touchesBegan
ジェスチャーの開始判定を行います。
今回はタッチの数が3点であるか判定します。
また、scaleを算出するために開始時点のタッチポイント間の距離を求めます

touchesMoved
タッチ位置の変更に対しての処理を行います。今回はtouchBeganで求めたタッチポイント間の距離と今の距離からプロパティscaleを算出します

touchesEnded
ジェスチャーの終了処理

touchesCancelled
キャンセルされた場合の処理

あ、それと <UIKit/UIGestureRecognizerSubclass.h>をインポートしておく必要があります。

それぞれの詳細は次回で。

インスタンスに特定のメソッドが実装されているか確認する

クラスのイベントを通知するためにid型のdelegateをプロパティで公開すると思いますが、そのdelegateが特定のメソッドを実装しているかを確認する方法です。

例えば
itemTouched:・・ item:・・
というようなメソッドが存在するか確認する場合には下記の通り

if (self.delegate && [self.delegate respondsToSelector:@selector(itemTouched:item:)])
{
[self.delegate itemTouched:self item:item];
}

アプリケーションの設定情報を保存する

NSUserDefaultsというクラスを使うと簡単に各種設定値を保存する事ができる。

使い方は下記を見てもらえば分かる通り、すごくシンプル。

//NSUserDefaultsの初期値を設定する
-(void)initConfigrations
{
NSMutableDictionary* keyValues = [NSMutableDictionarydictionary];
[keyValues setObject:@"0" forKey:@"KeyA"];
[keyValues setObject:@"0" forKey:@"KeyB"];
[[NSUserDefaults standardUserDefaults] registerDefaults:keyValues];
}
//設定をユーザ設定に保存する
-(void)saveConfigrations
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:self.propA forKey:@"KeyA"];
[defaults setInteger:self.propB forKey:@"KeyB"];
[defaults synchronize];
}
//ユーザ設定から設定内容を読み込む
-(void)loadConfigrations
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.propA = [defaults integerForKey:@"KeyA"];
self.propB = [defaults integerForKey:@"KeyB"];
}

ちなみに削除は removeObjectForKey で可能

WPでソースコードを表示

いろいろなサイトできれいにソースコードが表示されているので、私もまねてみます。

今回は「SyntaxHighlighter Evolved」ってのを導入してみた。

objective-cのソースを表示する時は

[objc]
ソースコード
[/objc]

って感じらしい。([]は半角で)

@interface HogeObject : NSObject
{
int counter;
}
-(void)doHogehoge;
@end

 

 

 

iPhoneの自動ロック(スリープ)を無効にする

UIApplicationクラスのidleTimerDisabledプロパティにYESをセットすればOk

[[UIApplication sharedApplication] setIdleTimerDisabled:YES];

 

タイミング的にはapplicationDidFinishLaunchingあたりに書けば良いのではないでしょうか。