誰かが iPhone を振ったときに反応したいです。どのように振ったかは特に気にしません。ほんの一瞬激しく振られただけです。これを検知する方法を知っている人はいますか?
ベストアンサー1
3.0 では、新しいモーション イベントにフックするという、より簡単な方法が採用されています。
主なコツは、シェイク イベント メッセージを受信するための firstResponder として必要な UIView (UIViewController ではない) を用意する必要があることです。以下は、任意の UIView でシェイク イベントを取得するために使用できるコードです。
@implementation ShakingView
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if ( event.subtype == UIEventSubtypeMotionShake )
{
// Put in code here to handle shake
}
if ( [super respondsToSelector:@selector(motionEnded:withEvent:)] )
[super motionEnded:motion withEvent:event];
}
- (BOOL)canBecomeFirstResponder
{ return YES; }
@end
これらのメソッドのみを使用してビューをサブクラス化するだけで、任意の UIView (システム ビューも含む) をシェイク イベントを取得できるビューに簡単に変換できます (その後、IB で基本タイプの代わりにこの新しいタイプを選択するか、ビューを割り当てるときにそれを使用します)。
ビュー コントローラでは、このビューをファーストレスポンダーになるように設定します。
- (void) viewWillAppear:(BOOL)animated
{
[shakeView becomeFirstResponder];
[super viewWillAppear:animated];
}
- (void) viewWillDisappear:(BOOL)animated
{
[shakeView resignFirstResponder];
[super viewWillDisappear:animated];
}
ユーザー アクションからファーストレスポンダーになる他のビュー (検索バーやテキスト入力フィールドなど) がある場合は、他のビューが辞任したときに、揺れているビューのファーストレスポンダー ステータスも復元する必要があることに注意してください。
この方法は、applicationSupportsShakeToEdit を NO に設定した場合でも機能します。