代码之家  ›  专栏  ›  技术社区  ›  stonecompass

显示UIAlertView时处理握手手势

  •  0
  • stonecompass  · 技术社区  · 8 年前

    我想在摇动设备时拍摄屏幕截图,也希望在UIAlertView可见时可以使用。 问题是没有调用MotionBegan和MotionEnded方法。我尝试过对UIWindow和UIAlertView进行子类化并覆盖其中的方法,但仍然没有调用任何方法。

    我是不是遗漏了什么?

    我通过呼叫启用握手手势

        UIApplication.SharedApplication.ApplicationSupportsShakeToEdit = true;
    

    在AppDelegate.cs中。

    当没有可见的UIAlertView时,这一切都能完美工作。

    显示UIAlertView时,哪个视图会响应震动手势?

    1 回复  |  直到 8 年前
        1
  •  2
  •   SushiHangover    8 年前

    UIAlertView .

    • 首先,它在iOS9中被弃用

    • 乱七八糟的 UIView ResignFirstResponder

    使用 UIAlertController 相反,它在iOS8/9/10中可用,并且像一个合适的 UIViewController 与一起使用时看起来像旧警报 UIAlertControllerStyle.Alert 风格,你不会有任何问题 MotionBegan/MotionEnded

    所以 您可以覆盖 运动开始/运动结束 在每个 UI视图控制器 :

    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);
    }
    

    创建您自己的UIWindow子类,这样您将获得全局运动事件(您只需发布( 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);
        }
    } 
    

    UI警报控制器 示例使用 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);