2016-07-21 5 views
0

デバイスを振るときにスクリーンショットを撮りたいと思うし、UIAlertViewが見えるときにこれを動作させたい。 問題は、MotionBeganおよびMotionEndedメソッドが呼び出されないことです。私は、UIWindowとUIAlertViewをサブクラス化し、そこのメソッドをオーバーライドしようとしましたが、何も呼び出されません。UIAlertViewが表示されているときにシェイクジェスチャーを処理する

ここに何か不足していますか?

私はAppDelegate.csで

UIApplication.SharedApplication.ApplicationSupportsShakeToEdit = true; 

を呼び出すことにより、ジェスチャーを振る可能。

UIAlertViewが表示されていないときはすべて正常に動作します。

UIAlertViewが表示されているときにどのようなビューが振る舞いに反応しますか?

答えて

2

UIAlertViewを使用しないことを強くお勧めします。

  • まずそれがiOS9

  • に廃止されました第二のそれは本当にではUIViewを台無し。 Appleはサブクラス化をサポートしておらず、ResignFirstResponderにしようとすると実際に横になってイベントを受け取ることができます。それに関する他の多くの事柄に加えて、Appleがそれを非難したのも不思議ではない。

使用UIAlertController代わりに、それはiOS8/9月10日に利用可能であり、適切なUIViewControllerのように機能し、UIAlertControllerStyle.Alertスタイルで使用し、それを使用しているときにMotionBegan/MotionEndedに問題を持っていないときに、古いアラートのように見えます。

のであなたはUIViewControllerのそれぞれにMotionBegan/MotionEndedを上書きするか:自分のUIWindowのサブクラスを作成

public override void MotionBegan(UIEventSubtype motion, UIEvent evt) 
{ 
    Console.WriteLine("MotionBegin"); 
    base.MotionBegan(motion, evt); 
} 

public override void MotionEnded(UIEventSubtype motion, UIEvent evt) 
{ 
    Console.WriteLine("MotionEnded"); 
    base.MotionEnded(motion, evt); 
} 

それともと、したがって、あなたがグローバルモーションイベントを取得します(あなただけの(PostNotificationNameを投稿することができます)を経由してアプリの他の領域がモーションイベントに応答する必要がある場合は通知センターに送信してください。

public class ShakeWindow : UIWindow 
{ 
    public ShakeWindow() : base() { } 

    public ShakeWindow(IntPtr handle) : base(handle) { } 

    public override void MotionBegan(UIEventSubtype motion, UIEvent evt) 
    { 
     Console.WriteLine("Window MotionBegin"); 
     NSNotificationCenter.DefaultCenter.PostNotificationName("ShakeMe", this); 
     base.MotionBegan(motion, evt); 
    } 

    public override void MotionEnded(UIEventSubtype motion, UIEvent evt) 
    { 
     Console.WriteLine("Window MotionEnded"); 
     base.MotionEnded(motion, evt); 
    } 
} 

UIAlertController使用例NSNotificationCenter

var button2 = new UIButton(UIButtonType.RoundedRect); 
button2.SetTitle("Alert 2", UIControlState.Normal); 
button2.Frame = new CGRect(20, 60, 100, 40); 
button2.TouchUpInside += (object sender, EventArgs e) => 
{ 
    var alert2 = UIAlertController.Create("StackOverflow", "Shake me now", UIAlertControllerStyle.Alert); 
    NSNotificationCenter.DefaultCenter.AddObserver(new NSString("ShakeMe"), (obj) => 
    { 
     alert2?.DismissViewController(true, null); 
    }); 
    alert2.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Default, (UIAlertAction obj) => 
    { 
     alert2.DismissViewController(true, null); 
    })); 
    PresentViewControllerAsync(alert2, true); 
}; 
Add(button2); 
+0

素晴らしい!早速のお返事ありがとうございます。代わりにUIAlertControllerを使用します。 UIAlertViewsを使用する理由は、ユーザーの中にはまだiOS 7があるため、UIAlerViewControllerを表示できないことが挙げられます。しかし、このスクリーンショット機能は内部テストのための機能なので、アラートを表示するときにOSのバージョンを確認するだけです。とにかくUIAlertViewControllersを実装する必要があります:-) – stonecompass

+1

@Hypo:iOS7(+)でアラートをサポートする必要がある場合は、カスタムUIViewControllerを作成してAlert-lookを再現します。と幸せなXammieコーディング... – SushiHangover

+0

本当に、ありがとう! – stonecompass

関連する問題