首页 > 解决方案 > macOS 上的 WKWebView 截断顶部

问题描述

我在 NSView 中放置了一个 WKWebView,y 坐标 > 0。加载页面(无论是哪个页面)后,它要么立即切断顶部,要么显示顶部一秒钟,然后跳下页面(通过这样做切断顶端)。

更重要的是,当我向上滚动时,我瞥见了顶部,但它反弹回来,不允许我真正滚动到顶部。

没有对 WKWebView 进行任何更改。我注意到的是,y 越小,被切断的部分就越小。

WKWebView 已通过 Interface Builder 添加。

如何让 WKWebView 显示在网站顶部?我正在使用斯威夫特。

这是它的样子:

在此处输入图像描述

这是实际网站的样子(注意可见的导航部分):

在此处输入图像描述

标签: swiftmacosinterface-builder

解决方案


好的,我遇到了和你一样的问题!检查视图的构造框架,如果它不是从 0,0 开始,请确保父视图不会自动调整子视图的大小。我试图将我的代码示例保持在最低限度。(请注意,此示例中不需要 webConfig.AllowsAirPlayForMediaPlayback)

这是一个工作示例。您可以将视图切换为窗口中的全帧或定位为父视图中的较小视图。我在 IB 中将窗口设置为 1024x768。

您可以轻松地将此代码转换为 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.
            }
        }
    }
}

推荐阅读