尝试以编程方式创建尺寸小于屏幕的 iOS WKWebView

Posted

技术标签:

【中文标题】尝试以编程方式创建尺寸小于屏幕的 iOS WKWebView【英文标题】:Trying to create an iOS WKWebView with a size smaller than the screen programmatically 【发布时间】:2016-06-26 23:49:36 【问题描述】:

我从一个简单的应用开始,它只使用 WKWebView 显示一个 Web 视图。 一切都可以构建,并且工作正常,除了它始终是全屏的。理想情况下,它不会延伸到顶部的 ios 状态栏下方。它需要降低 20px 才能低于它。我已经广泛搜索了解决方案,但没有改变大小。 InterfaceBuilder 中没有设置任何内容,我正在以编程方式进行所有操作。使用 Swift。

这似乎是许多带有 WKWebView 的应用程序会做的基本操作。应该很简单。我可能遗漏了一些明显的东西。任何帮助表示赞赏。提前致谢。

这是我目前所拥有的:

import UIKit
import WebKit
class ViewController: UIViewController, UIGestureRecognizerDelegate , UIWebViewDelegate, WKNavigationDelegate  

    let url = NSURL(string:"http://***.com")
    var webView: WKWebView!

    override func viewDidLoad() 
        super.viewDidLoad()
        webView = WKWebView(frame: CGRect( x: 0, y: 20, width: 380, height: 150 ), configuration: WKWebViewConfiguration() )
        self.view = webView
        self.view.frame = webView.frame
        let req = NSURLRequest(URL:url!)
        webView.loadRequest(req)
        self.webView.allowsBackForwardNavigationGestures = true
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

非常感谢埃米利奥!!调整后的代码完美运行!

import UIKit
import WebKit
class ViewController: UIViewController, UIGestureRecognizerDelegate , UIWebViewDelegate, WKNavigationDelegate  

    let url = NSURL(string:"http://***.com")
    var webView: WKWebView!

    override func viewDidLoad() 
        super.viewDidLoad()
        webView = WKWebView(frame: CGRect( x: 0, y: 20, width: self.view.frame.width, height: self.view.frame.height - 20 ), configuration: WKWebViewConfiguration() )
        self.view.addSubview(webView)
         let req = NSURLRequest(URL:url!)
        webView.loadRequest(req)
        self.webView.allowsBackForwardNavigationGestures = true
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

【问题讨论】:

谢谢,很有用!! 【参考方案1】:

您的问题是UIViewControllers 以某些方式呈现将管理他们的视图框架。例如,如果您以模态方式(作为根控制器或在导航栏中)显示它,手动设置名声将不起作用。 (这些只是几个例子)。

如果要管理视图的框架,可以将webView 作为子视图添加到视图控制器的view。修改它的框架就可以了。

我想指出的一件事是,在调用self.view = webView 之后调用self.view.frame = webView.frame 是多余的,因为它们都是同一个对象,所以你实际上正在做的是:

self.view.frame = self.view.frame

【讨论】:

【参考方案2】:

我会为一些图标腾出空间并花很多时间来解决这个问题。解决方案是将调整放在 viewDidAppear 函数中。

import UIKit
import WebKit

class ViewController: UIViewController 
    let webView  = WKWebView()
    let url_base = "http://www.ztatz.nl"

     override func loadView() 
         self.view = webView
         webView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), 
         options: .new, context: nil)
     

      override func observeValue(forKeyPath keyPath: String?, of object: Any?, 
        change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) 
        if keyPath == "estimatedProgress" 
            print(Float(webView.estimatedProgress))
        
    

     override func viewDidLoad() 
        super.viewDidLoad()
        webView.load( url_base )
     

     override func viewDidAppear(_ animated: Bool) 
        self.webView.frame   = CGRect(x: 0, y: 0, width: self.view.frame.width, 
        height: self.view.frame.height - 100)
        

   

   extension WKWebView 
       func load(_ urlString: String) 
          if let url = URL(string: urlString) 
           let request = URLRequest(url: url)
           load(request)
        
       
    

【讨论】:

以上是关于尝试以编程方式创建尺寸小于屏幕的 iOS WKWebView的主要内容,如果未能解决你的问题,请参考以下文章

Unity 4.3 2d 以编程方式创建 Sprite

以编程方式创建网格视图

如何为小于 600 的小屏幕创建响应表

如何一劳永逸地以编程方式获取android屏幕尺寸?

尝试调整我的 UIView 容器以适应较小的 iPhone 屏幕尺寸

如何以编程方式将矢量图像放入 iOS 资产目录