【问题标题】:xamarin.forms webview.focused event raised on Android, but not on iOSxamarin.forms webview.focused 事件在 Android 上引发,但不在 iOS 上
【发布时间】:2019-08-01 21:29:36
【问题描述】:

我正在使用 Xamarin.Forms 网格应用程序在网格 CardGrid 的单元格中将几个 html 元素显示为 WebView:

    private async void CreateCardView()
    {
        CardGrid.Children.Clear();

        // idx over all count elements of html snippets
        for (idx = 0; idx < count; idx++)
        {
            string html = AuthoringCard(idx);
            RenderingCard(html, idx);
        }
    }

AuthoringCard() 创建 html 代码 sn-p。

RenderingCard() 在网格单元格内创建 WebView。

    private void RenderingCard(string htmlCard, int index)
    {
        int CardWidth = 300;
        int CardHeight = 150;
        int CardNoHorizontally = 3;

        WebView uiCard = new WebView();
        uiCard.HeightRequest = CardHeight - 5;
        uiCard.WidthRequest= CardWidth - 5;
        uiCard.VerticalOptions = LayoutOptions.Start;
        uiCard.HorizontalOptions = LayoutOptions.Center;
        uiCard.Margin = new Thickness(0);
        uiCard.AutomationId = index.ToString();
        uiCard.Focused += Card_Tapped;
        uiCard.InputTransparent = false;

        var htmlSource1 = new HtmlWebViewSource
        {
            Html = htmlCard,
        };
        uiCard.Source = htmlSource1;

        CardGrid.Children.Add(uiCard);

        int row = (int)Math.Floor((double)(index / CardNoHorizontally));
        int column = index - (row * CardNoHorizontally);

        Grid.SetRow(uiCard, row);
        Grid.SetColumn(uiCard, column);
    }

我想捕捉 Focused 事件,当用户点击卡片(WebView)并使用 AutomationId 获取卡片的索引(html 代码 sn-p)时:

    private void Card_Tapped(object sender, EventArgs e)
    {
        WebView card = (WebView)sender;

        int index = Convert.ToInt16(card.AutomationId));
    }

这适用于 Android。在 iOS 下,该事件永远不会引发。有什么解决办法吗?

【问题讨论】:

    标签: ios xamarin.forms webview


    【解决方案1】:

    原因:

    Forms中的属性Focus对应我们在原生iOS平台中调用的方法becomeFirstResponder。很遗憾,UIWebView和WKwebview不支持方法becomeFirstResponder。该方法仅在一些'input-controls'中可用作为 UITextField 和 UITextView(表单中的条目)。因此,即使您在 webview 上设置事件。它在 iOS 中也不起作用。

    解决方法:

    您可以在webview上添加TapGestureRecognizer。并且您必须使用CustomRenderer来实现它。因为如果您在表单中添加TapGestureRecognizer会产生冲突。 请参考以下代码。

    在表单中

    public MainPage()
    {
     if (Device.RuntimePlatform == "iOS")
       {
    
          MessagingCenter.Subscribe<Object,string>(this,"webview_click", (sender,arg)=> {
    
         // int index = Convert.ToInt16(arg));
    
         });
       }
    }
    

    在 iOS 中

    using System;
    using Foundation;
    using UIKit;
    using Xamarin.Forms;
    using Xamarin.Forms.Platform.iOS;
    using xxx;
    using xxx.iOS;
    using ObjCRuntime;
    [assembly:ExportRenderer(typeof(WebView),typeof(MyWebViewRenderer))]
    namespace xxx.iOS
    {
      public class MyWebViewRenderer : WebViewRenderer, IUIGestureRecognizerDelegate
      {
    
        public bool isFirstLoad = true;
    
        public MyWebViewRenderer()
        {
    
        }
    
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
    
            if (e != null)
            {
                UITapGestureRecognizer tap = new UITapGestureRecognizer(this, new Selector("Tap_Handle:"));
                tap.WeakDelegate = this;
                this.AddGestureRecognizer(tap);
            }
    
        }
    
        [Export("gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:")]
        public bool ShouldRecognizeSimultaneously(UIGestureRecognizer gestureRecognizer, UIGestureRecognizer otherGestureRecognizer)
        {
            return true;
        }
    
        [Export("Tap_Handle:")]
        void Tap_Handle(UITapGestureRecognizer tap)
        {
            if(isFirstLoad)
            {
                isFirstLoad = false;
                MessagingCenter.Send<Object,string>(this, "webview_click",Element.AutomationId);
            }
        }
    
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      相关资源
      最近更新 更多