1. ホーム
  2. ios

[解決済み] iPhoneを振られたことを検知するには?

2022-03-16 02:32:15

質問

誰かがiPhoneを振ったときに反応したい。どのように振られたかは特に気にせず、一瞬勢いよく振られただけでいい。これを検出する方法をご存知の方はいらっしゃいますか?

解決方法は?

3.0では、新しいモーションイベントにフックすることで、より簡単な方法があります。

主なトリックは、シェイク・イベント・メッセージを受け取る最初のレスポンダーとなる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

これらのメソッドのみを持つビューをサブクラス化する(そして、IBでベースタイプの代わりにこの新しいタイプを選択するか、ビューを割り当てるときにこれを使用する)だけで、どんなUIView(システムビューでさえ)も簡単にシェイクイベントを取得できるビューに変換することができます。

ビューコントローラーで、このビューをファーストレスポンダーに設定したい。

- (void) viewWillAppear:(BOOL)animated
{
    [shakeView becomeFirstResponder];
    [super viewWillAppear:animated];
}
- (void) viewWillDisappear:(BOOL)animated
{
    [shakeView resignFirstResponder];
    [super viewWillDisappear:animated];
}

ユーザーのアクションによってファーストレスポンダーになる他のビュー(検索バーやテキスト入力フィールドなど)がある場合、他のビューが辞任したときにシェイキングビューのファーストレスポンダーの状態を復元する必要があることを忘れないでください。

この方法は、applicationSupportsShakeToEditをNOに設定しても機能します。