WKWebView на macOS обрезает верх

Я поместил WKWebView внутри NSView с координатой y> 0. После загрузки страницы (независимо от того, какая из них) он либо сразу отрезает верх, либо на секунду показывает верх, а затем перепрыгивает вниз по странице (при этом обрезая вершина).

Более того, когда я прокручиваю вверх, я мельком вижу верхнюю часть, но она отскакивает назад, не позволяя мне фактически прокручиваться до самого верха.

В WKWebView не было внесено никаких изменений. Я заметил, что чем меньше y, тем меньше отрезанная часть.

WKWebView был добавлен через Interface Builder.

Как сделать так, чтобы WKWebView отображал верхнюю часть веб-сайта? Я использую Swift.

Вот как это выглядит:

Вот как выглядит настоящий веб-сайт (обратите внимание на видимый раздел навигации):

1 ответ

Хорошо, у меня была такая же проблема, как и у вас! Проверьте фрейм вашего представления при построении и, если он не начинается с 0,0, убедитесь, что родительский вид не изменяет размер подвидов автоматически. Я старался свести образец кода к минимуму. (обратите внимание, что webConfig.AllowsAirPlayForMediaPlayback не требуется в этом примере)

Вот рабочий пример. Вы можете переключить вид на полный кадр в окне или на меньший вид в родительском окне. Я установил размер окна 1024x768 в IB.

Вы можете легко преобразовать этот код в Swift.

Ключ состоит в том, чтобы не изменять размер подвидов автоматически, если вид размещается со смещением, отличным от 0,0.

быстрый образец:

//#define USE_FULL_WINDOW // uncomment this to fit webview full window

using System;
using AppKit;
using Foundation;
using WebKit;
using CoreGraphics;
using System.Diagnostics;

namespace WkWebTest
{
    public class MediaView : NSView
    {
        private WKWebView webView;

        public MediaView(CGRect frame)
            : base(frame)
        {
#if USE_FULL_WINDOW
            this.AutoresizesSubviews = true;
            this.AutoresizingMask = NSViewResizingMask.HeightSizable | NSViewResizingMask.WidthSizable;
#endif

            WKWebViewConfiguration webConfig = new WKWebViewConfiguration();
            webConfig.AllowsAirPlayForMediaPlayback = true;
            this.webView = new WKWebView(new CGRect(0, 0, frame.Width, frame.Height), webConfig);
            this.webView.AutoresizesSubviews = true;
            this.webView.AutoresizingMask = NSViewResizingMask.HeightSizable | NSViewResizingMask.WidthSizable;
            this.AddSubview(this.webView);

            string url = "http://www.apple.com";
            Debug.WriteLine("LoadUrl: " + url);
            var request = new NSUrlRequest(new NSUrl(url));
            this.webView.LoadRequest(request);
        }

        public override bool IsFlipped { get { return true; } }
    }

    public partial class ViewController : NSViewController
    {
        private MediaView mediaView;

        public ViewController(IntPtr handle) : base(handle)
        {
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

#if USE_FULL_WINDOW
            float mediaViewLeft = 0;
            float mediaViewTop = 0;
            nfloat mediaViewWidth = View.Frame.Width;
            nfloat mediaViewHeight = View.Frame.Height;
#else
            float mediaViewLeft = 511;
            float mediaViewTop = 112;
            nfloat mediaViewWidth = 475;
            nfloat mediaViewHeight = 548;
#endif
            this.mediaView = new MediaView(new CGRect(mediaViewLeft, mediaViewTop, mediaViewWidth, mediaViewHeight));
            this.View.AddSubview(mediaView);
        }

// boiler plate code generated by Xamarin
        public override NSObject RepresentedObject
        {
            get
            {
                return base.RepresentedObject;
            }
            set
            {
                base.RepresentedObject = value;
                // Update the view, if already loaded.
            }
        }
    }
}
Другие вопросы по тегам