如何在 iPhone 中使用 Xamarin.Forms 中的 WebView 在没有全屏模式的情况下播放视频?

How to play video in iPhone without fullscreen mode using WebView in Xamarin.Forms?

我在 Xamarin.Forms 项目中使用 WebView 播放视频。 iPhone 视频正在全屏播放,但我需要在 WebView 中播放视频而不是全屏。

我只在 iPhone 上有这个问题。在 Android、Windows 和 iPad 设备上,视频正在非全屏播放。

案例 1:普通 WebView

<WebView 
    x:Name="web_view"
    HorizontalOptions="FillAndExpand"
    VerticalOptions="FillAndExpand"/>

web_view.Source = videoUrl;

案例二:自定义webview

在某些方面,我使用的是自定义 WebView。在这种情况下,视频也在全屏模式下播放。

public  class MyWebView : WebView
{
    public static readonly BindableProperty UrlProperty = BindableProperty.Create(
    propertyName: "Url",
    returnType: typeof(string),
    declaringType: typeof(MyWebView),
    defaultValue: default(string));

    public string Url
    {
        get { return (string)GetValue(UrlProperty); }
        set { SetValue(UrlProperty, value); }
    }
}

以上2种情况,我需要在iPhone上不全屏播放视频。

您可以在自定义渲染器中将 AllowsInlineMediaPlayback 设置为 True

[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]

namespace CustomWebview.iOS
{
    public class MyWebViewRenderer : ViewRenderer<MyWebView, WKWebView>
    {
        WKWebView wkWebView;

        protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
        {
            base.OnElementChanged(e);

            if (Control == null)
            {
                WKWebViewConfiguration configuration = new WKWebViewConfiguration();
                configuration.AllowsInlineMediaPlayback = true;
                wkWebView = new WKWebView(CGRect.Empty, configuration);

                if (Element.Url != null)
                {
                    wkWebView.LoadRequest(new NSUrlRequest(new NSUrl((Element).Url)));
                }
                SetNativeControl(wkWebView);
            }

            if (e.NewElement != null)
            {
                CallVideo();
            }
        }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName.Equals(nameof(Element.Url)))
            {
                wkWebView.LoadRequest(new NSUrlRequest(new NSUrl((Element).Url)));
            }
        }

        public override void Draw(CGRect rect)
        {
            base.Draw(rect);

            Control.Frame = rect;
        }
    }
}

添加了一个 if 语句来排除 null 条件。然后在表单中设置时加载 URL。 OnElementPropertyChanged 将在 webview 的 属性 发生变化时被调用。所以当你在表单中设置它的URL时,我们可以在这个方法中加载请求。