尝试以编程方式创建一个小于屏幕大小的iOS WKWebView

14

我开始制作一个简单的应用程序,它只是使用WKWebView显示一个网页视图。一切都构建得很好,并且可以正常工作,唯一的问题是它总是全屏显示。理想情况下,它不应该延伸到iOS顶部的状态栏下面。它需要向下降低20像素,以便在其下方。我已经广泛搜索了解决方案,但没有改变其大小的任何内容。在InterfaceBuilder中没有设置任何内容,我正在通过编程完成所有操作。使用Swift。

这似乎是许多使用WKWebView的应用程序都会做的基本事情。它应该很简单。我可能错过了一些显而易见的东西。感谢您的帮助。提前致谢。

这是我目前的代码:

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

    let url = NSURL(string:"http://stackoverflow.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.
    }
}

非常感谢Emilio!!调整后的代码完美运行!

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

    let url = NSURL(string:"http://stackoverflow.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.
    }
}

谢谢,这很有用!! - Mario Burga
3个回答

4
你的问题在于以某些方式呈现的UIViewControllers会管理其视图的框架。例如,如果你将其模态呈现、作为根控制器或者在导航栏中呈现,手动设置框架将不起作用(这只是一些例子)。
如果你想管理视图的框架,可以将webView作为子视图添加到你的视图控制器的view中。然后修改它的框架就会生效。
需要指出的一件事是,在调用self.view = webView后再调用self.view.frame = webView.frame是多余的,因为它们都是同一个对象,所以你实际上做的是:
self.view.frame = self.view.frame

0

以上的解决方案对我没有用。

所以我尝试了以下的解决方案,它起作用了。

import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {
    
    var url: URL
    
    func makeUIView(context: Context) -> WKWebView {
        
        return WKWebView(frame: CGRect(x: 0,y: 0 , width: UIScreen.main.bounds.size.width, height:200))
    }
    
    func updateUIView(_ webView: WKWebView, context: Context) {
        let request = URLRequest(url: url)
        webView.load(request)
    }
}

并从您的结构中调用。

struct TermsOfService: View {
    var body: some View {
        VStack {
            WebView(url: URL(string: "https://in.search.yahoo.com")!)
        }
    }
}

0

我讨厌为一些图标腾出空间并花费大量时间来修复它。解决方案是将调整放置在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)
        }
       }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接