UIAlertController 上的 UITapGestureRecognizer 未触发

Posted

技术标签:

【中文标题】UIAlertController 上的 UITapGestureRecognizer 未触发【英文标题】:UITapGestureRecognizer on UIAlertController is not firing 【发布时间】:2019-06-21 14:40:18 【问题描述】:

我正在尝试将 UITapGestureRecognizer 附加到 UIAlertController 的视图,但识别事件从未触发。

我在 Xamarin 中对此进行编码,但我觉得这个问题也适用于本机代码。

InvokeOnMainThread(() =>

    var alert = new UIAlertController();
    alert.Title = "My Title";
    alert.Message = "My Message";

    UITapGestureRecognizer tapGestureRecognizer = new 
        UITapGestureRecognizer((gesture) =>
        
            //I never get here
        );

    alert.View.AddGestureRecognizer(tapGestureRecognizer);
    alert.View.UserInteractionEnabled = true;

    this.PresentViewController(alert, true, null);
);

理想情况下,我想在用户触摸弹出窗口时关闭警报,但我似乎无法检测到手势。

我尝试在显示警报之前和之后添加识别器。

【问题讨论】:

是的,这行不通 见这里***.com/a/36568023/2754727 我的解决方案对你有用吗? 【参考方案1】:

解决方案:

要通过单击背景视图关闭UIAlertController,您可以在弹出UIAlertController 时将tapGestureRecognizer 添加到屏幕中的最后一个视图,请检查以下代码:

public partial class ViewController : UIViewController

    public ViewController (IntPtr handle) : base (handle)
    
    

    public override void ViewDidLoad ()
    
        base.ViewDidLoad ();
        // Perform any additional setup after loading the view, typically from a nib.

        var alert = new UIAlertController();
        alert.Title = "My Title";
        alert.Message = "My Message";

        UIAlertAction ac1 = UIAlertAction.Create("123",UIAlertActionStyle.Cancel,null);

        alert.AddAction(ac1);

        this.PresentViewController(alert, true, addGesOnBackGround);
    

    public void addGesOnBackGround() 

        UIView backView = new UIView();

        Array arrayViews = UIApplication.SharedApplication.KeyWindow.Subviews;

        if (arrayViews.Length >0)
        
            backView = arrayViews.GetValue(arrayViews.Length-1) as UIView;               
        

        UITapGestureRecognizer tapGestureRecognizer = new
         UITapGestureRecognizer((gesture) =>
         
             //I never get here
             this.DismissViewControllerAsync(true);

         );

        backView.AddGestureRecognizer(tapGestureRecognizer);
        backView.UserInteractionEnabled = true;
    


【讨论】:

这个解决方案对我不起作用。手势识别器动作仍未被调用。 @Dave 我使用该代码,它在我身边有效。我上传了sample here,你可以查看。你错过了什么吗?

以上是关于UIAlertController 上的 UITapGestureRecognizer 未触发的主要内容,如果未能解决你的问题,请参考以下文章

无法在 iOS8 上的 UIAlertController 中显示 UIPickerView

iOS:UIAlertController 上的 textField 成为当前警报时的第一响应者

iOS - UIButton 作为 UIAlertController 上的子视图不触发事件

在呈现的视图控制器上的 UITableViewCell 中呈现 UIAlertController

iOS9 上的 UIAlertController ActionSheet 问题

禁止UIAlertController的dimiss