WKWebView на macOS отсекает верх - PullRequest
0 голосов
/ 13 октября 2019

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

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

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

WKWebView был добавлен через Интерфейсный Разработчик.

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

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

enter image description here

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

enter image description here

1 Ответ

1 голос
/ 15 ноября 2019

Хорошо, у меня была такая же проблема, как и у вас! Проверьте фрейм своего представления на построении и, если он не начинается с 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.
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...