14

iPhoneデバイスのシェイクで、いくつかの関数を呼び出したいのですが、シェイクを認識する方法がわからないので、いくつかのリンクを試し、このコードを試しました

-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{{
    if(event.type == UIEventSubtypeMotionShake)
    {{
        NSLog(@ "called");
        [self.view setBackgroundColor:[UIColor greenColor]];
    }
}

-(BOOL)canBecomeFirstResponder
{{
YESを返します。
}

しかし、残念ながら運が悪いので、私が同じことをする方法を教えてください

よろしくお願いします

4

4 に答える 4

33

議論された上記のコメントに従って、私は他の人が私が持っている解決策を読むことができるように私の質問に答えています

UIResponderクラスのドキュメントでは、モーションイベントは最初のレスポンダーにのみ応答すると言われているので、私が行ったのは小さな関数を追加するだけで、それが私にとってのトリックでした。これが私の解決策です。

-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{{
    if(event.type == UIEventSubtypeMotionShake)
    {{
        NSLog(@ "called");
        [self.view setBackgroundColor:[UIColor greenColor]];
    }
}

-(BOOL)canBecomeFirstResponder
{{
YESを返します。
}

それでも揺れの動きを検出できなかったので、ビューコントローラーをファーストレスポンダーにするだけでした。そのために使用したコードは次のとおりです。

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [自己becomeFirstResponder];
}

そして私は終わった

これは私が思いついた解決策でした

よろしくお願いします

于 2011-05-19T09:20:25.593 に答える
2

あなたはこのようなことをすることができます...

まず...

アプリのデリゲートでapplicationSupportsShakeToEditプロパティを設定します。

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    application.applicationSupportsShakeToEdit = YES;

    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}

第二に...

canBecomeFirstResponder、viewDidAppear:およびviewWillDisappear:ビューコントローラのメソッドを追加/オーバーライドします。

-(BOOL)canBecomeFirstResponder {
    return YES;
}

-(void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   [self becomeFirstResponder];
}

- (void)viewWillDisappear:(BOOL)animated {
    [self resignFirstResponder];
    [super viewWillDisappear:animated];
 }

第三に...

MotionEndedメソッドをViewControllerに追加します。

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
   if (motion == UIEventSubtypeMotionShake)
   {
    // your code
   }
 }

最初の答えがうまくいかず、これはすぐに入力され、テストされていない場合にのみ機能するはずです:)

于 2013-04-01T22:59:05.613 に答える
0

アプリのすべての画面でシェイクをグローバルに処理するには、UIWindowをサブクラス化し、motionEndedを実装します。これは、イベントがウィンドウオブジェクトに到達するまでレスポンダーチェーンをバブルアップするためです。Xamarinの使用例:

public class MyWindow : UIWindow
{
    public MyWindow(CoreGraphics.CGRect frame)
        : base (frame)
    { }

    public override void MotionEnded (UIEventSubtype motion, UIEvent evt)
    {
        if (motion == UIEventSubtype.MotionShake) {
            Console.WriteLine ("Shake received");
        }
    }
}

次に、AppDelegateで、windowメソッドを実装してUIWindowサブクラスのインスタンスを返します。Xamarinの使用例:

public class AppDelegate : UIApplicationDelegate
{
    UIWindow _window;

    public override UIWindow Window 
    { 
        get
        {
            if (_window == null) {
                _window = new MyWindow (UIScreen.MainScreen.Bounds);
            }

            return _window;
        }
        set
        {
        }
    }

    // ...
}

Voilà、シェイクはアプリ全体で処理されます。

于 2015-08-30T16:32:45.460 に答える
0

SSEventListenerを使用すると、作業が簡単になります。ビューコントローラはこれ以上オーバーライドする必要はありませんmotionEnded:withEvent:!を使用SSEventListenerすると、次のように簡単にシェイクイベントを聞くことができます。

[viewController ss_setShakeEventListener:^{ ... }];

于 2018-01-15T06:49:52.420 に答える