尝试以编程方式创建尺寸小于屏幕的 iOS WKWebView
Trying to create an iOS WKWebView with a size smaller than the screen programmatically
我从一个简单的应用程序开始,该应用程序仅使用 WKWebView 显示网络视图。
一切都在构建,并且工作正常,除了它总是全屏。理想情况下,它不会扩展到顶部的 iOS 状态栏下。它需要降低 20px 才能低于它。我广泛搜索了解决方案,但没有改变大小。 InterfaceBuilder 中没有任何设置,我正在以编程方式进行所有操作。使用 Swift.
这似乎是许多带有 WKWebView 的应用程序都会做的基本事情。它应该很简单。我可能遗漏了一些明显的东西。任何帮助表示赞赏。提前致谢。
这是我目前拥有的:
import UIKit
import WebKit
class ViewController: UIViewController, UIGestureRecognizerDelegate , UIWebViewDelegate, WKNavigationDelegate {
let url = NSURL(string:"http://whosebug.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://whosebug.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.
}
}
您的问题是 UIViewControllers
以某些方式呈现会管理他们的视图框架。例如,如果您以模态方式显示它,例如作为根控制器或在导航栏中,手动设置 fame 将不会有任何效果。 (这些只是几个例子)。
如果您想管理视图的框架,您可以将 webView
作为子视图添加到视图控制器的 view
。修改它的框架就可以了。
我想指出的一件事是,在调用 self.view = webView
之后调用 self.view.frame = webView.frame
是多余的,因为它们都是同一个对象,所以你有效地做的是:
self.view.frame = self.view.frame
我想为一些图标腾出空间,并花了很多时间来修复它。解决方案是将调整放在 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)
}
}
}
我从一个简单的应用程序开始,该应用程序仅使用 WKWebView 显示网络视图。 一切都在构建,并且工作正常,除了它总是全屏。理想情况下,它不会扩展到顶部的 iOS 状态栏下。它需要降低 20px 才能低于它。我广泛搜索了解决方案,但没有改变大小。 InterfaceBuilder 中没有任何设置,我正在以编程方式进行所有操作。使用 Swift.
这似乎是许多带有 WKWebView 的应用程序都会做的基本事情。它应该很简单。我可能遗漏了一些明显的东西。任何帮助表示赞赏。提前致谢。
这是我目前拥有的:
import UIKit
import WebKit
class ViewController: UIViewController, UIGestureRecognizerDelegate , UIWebViewDelegate, WKNavigationDelegate {
let url = NSURL(string:"http://whosebug.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://whosebug.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.
}
}
您的问题是 UIViewControllers
以某些方式呈现会管理他们的视图框架。例如,如果您以模态方式显示它,例如作为根控制器或在导航栏中,手动设置 fame 将不会有任何效果。 (这些只是几个例子)。
如果您想管理视图的框架,您可以将 webView
作为子视图添加到视图控制器的 view
。修改它的框架就可以了。
我想指出的一件事是,在调用 self.view = webView
之后调用 self.view.frame = webView.frame
是多余的,因为它们都是同一个对象,所以你有效地做的是:
self.view.frame = self.view.frame
我想为一些图标腾出空间,并花了很多时间来修复它。解决方案是将调整放在 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)
}
}
}