Событие xamarin.forms webview.focused возникло на Android, но не на iOS - PullRequest
1 голос
/ 11 марта 2019

Я использую сеточное приложение Xamarin.Forms для отображения пары html-элементов в виде веб-представлений в ячейках сетки. CardGrid:

    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-кода.

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):

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

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

Это прекрасно работает с Android. Под iOS событие никогда не поднимается. Есть идеи для решения?

1 Ответ

1 голос
/ 13 марта 2019

Причина:

свойство Focus в Forms соответствует методу, который мы назвали становитьсяFirstResponder на собственной платформе iOS. К сожалению, UIWebView и WKwebview не поддерживают метод becomeFirstResponder. Этот метод доступен только для некоторых входных данных -controls 'Такие как UITextField и UITextView (Entry in Forms). Так что даже если вы установите событие на webview. Это не будет работать в iOS.

Обход:

Вы можете добавить 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);
        }
    }

  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...