macOS上的WKWebView绝顶

时间:2019-10-13 20:07:24

标签: swift macos interface-builder

我将WKWebView放置在y坐标> 0的NSView内。加载页面(无论哪个页面)后,它要么立即切掉顶部,要么显示顶部一秒钟,然后跳下页面(通过执行所以剪掉顶部)。

更重要的是,当我向上滚动时,我可以瞥见顶部,但它会弹回来,不允许我实际滚动到顶部。

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

WKWebView已通过Interface Builder添加。

如何使WKWebView显示在网站顶部?我正在使用Swift。

这是它的样子:

enter image description here

这是实际网站的外观(请注意可见的导航部分):

enter image description here

1 个答案:

答案 0 :(得分:1)

好的,我和你有同样的问题!检查视图的构造框架,如果它不是从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.
            }
        }
    }
}