- Date: Wed 17 02 ,2010
- Category: SDK
- Tags: ---
- Response: Comment 0 Trackback 0
[開発Tips]シェイクモーションの使い方とはまること
[Apple][iPhone][SDK]

久々の開発tipsです。
twitterやるのを我慢?しながら、地道に開発しております。
今回のは、シェイクモーションです。
最後のほうにはまった事例も書いてますので参考にしてみてください。
まず実装の方法は、それほど難しくありません。
タッチイベントとかひろうのは、オーバライドするだけで認識されますよね。
シェイクモーションは、自分でファーストレスポンダに設定してやらないと受け取れないのが
面倒なくらいです。
以下、ViewControllerへの実装のサンプルコードです。
- (BOOL)canBecomeFirstResponder {
return YES;
}
まず、これをオーバライドします。(書くだけです。)
これは、自分のクラスがファーストレスポンダになれるかということです。
もちろんYESを返してください。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self becomeFirstResponder];
};
この[self becomeFirstResponder]で、自分自身をファーストレスポンダに設定します。
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
// NSLog(@"motionEnd");
}
シェイクすると、こちらのイベントが呼ばれるようになります。
他の、モーション系のイベントもオーバライドすれば呼ばれます。
ただ、何かやるならmotionEndedで十分です。
簡単に、使うことができます。
ところが、この先に拡張していくと問題がでることがあります。
ここからは、はまってしまった事例です。
上のシェイクモーションで次のviewControllerを表示させたとします。
その先でTextViewやTextViewFieldなどを使いたいとします。
なぜか、キーボードがでなくなってしまうのです。w
キーボードはtextViewがタッチされるとファーストレスポンダを受け取って
キーボードを出現させるので、ファーストレスポンダがこないということだと...
このへんは、レスポンダのことをちゃんと理解してる方はわかるのでしょうけど
私は2時間程はまりました。w
ようは、前のクラスのファーストレスポンダをやめてしまえばいいのだと考え、
先ほどの、motionEndedの中で、resignFirstResponderを呼んでみました。
しかし、事態は改善されませんでした。
resignFirstResponderというのは、ファーストレスポンダをやめますよ、というメソッドです。
別の使い方だとキーボードを閉じるときにも使えます。
悩んだあげく、タイミングの問題だと思い呼び出した先のクラスから元のクラスの
resignFirstResponderを呼んであげたところ解決しました。
もしかしたら、自信のクラスからでも
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
などで、遅延実行させてあげれば大丈夫かもしれません。(ためしてません。)
いつものごとく、これが正しいのかわかりませんが、参考になれば幸いです。

久々の開発tipsです。
twitterやるのを我慢?しながら、地道に開発しております。
今回のは、シェイクモーションです。
最後のほうにはまった事例も書いてますので参考にしてみてください。
まず実装の方法は、それほど難しくありません。
タッチイベントとかひろうのは、オーバライドするだけで認識されますよね。
シェイクモーションは、自分でファーストレスポンダに設定してやらないと受け取れないのが
面倒なくらいです。
以下、ViewControllerへの実装のサンプルコードです。
- (BOOL)canBecomeFirstResponder {
return YES;
}
まず、これをオーバライドします。(書くだけです。)
これは、自分のクラスがファーストレスポンダになれるかということです。
もちろんYESを返してください。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self becomeFirstResponder];
};
この[self becomeFirstResponder]で、自分自身をファーストレスポンダに設定します。
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
// NSLog(@"motionEnd");
}
シェイクすると、こちらのイベントが呼ばれるようになります。
他の、モーション系のイベントもオーバライドすれば呼ばれます。
ただ、何かやるならmotionEndedで十分です。
簡単に、使うことができます。
ところが、この先に拡張していくと問題がでることがあります。
ここからは、はまってしまった事例です。
上のシェイクモーションで次のviewControllerを表示させたとします。
その先でTextViewやTextViewFieldなどを使いたいとします。
なぜか、キーボードがでなくなってしまうのです。w
キーボードはtextViewがタッチされるとファーストレスポンダを受け取って
キーボードを出現させるので、ファーストレスポンダがこないということだと...
このへんは、レスポンダのことをちゃんと理解してる方はわかるのでしょうけど
私は2時間程はまりました。w
ようは、前のクラスのファーストレスポンダをやめてしまえばいいのだと考え、
先ほどの、motionEndedの中で、resignFirstResponderを呼んでみました。
しかし、事態は改善されませんでした。
resignFirstResponderというのは、ファーストレスポンダをやめますよ、というメソッドです。
別の使い方だとキーボードを閉じるときにも使えます。
悩んだあげく、タイミングの問題だと思い呼び出した先のクラスから元のクラスの
resignFirstResponderを呼んであげたところ解決しました。
もしかしたら、自信のクラスからでも
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
などで、遅延実行させてあげれば大丈夫かもしれません。(ためしてません。)
いつものごとく、これが正しいのかわかりませんが、参考になれば幸いです。