swift 键盘打开时WKWebView上的额外空间

qyuhtwio  于 2023-01-08  发布在  Swift
关注(0)|答案(3)|浏览(107)

当键盘打开时,我正在调整webview的大小。我为webview添加了一些调试样式,如下所示

self.webViewController.view.layer.borderWidth = 5
self.webViewController.view.layer.borderColor = UIColor.green.cgColor
self.webViewController.view.backgroundColor = UIColor.blue

示例如下:https://github.com/zecar/ios-app-clone

这是我打开键盘后得到的结果。调整大小似乎工作正常,我在webview周围有绿色边框,所以这很好。问题是显示的蓝色背景,它似乎与键盘的高度完全相同。
这就是我调整大小的方法

self.keyboardOpenedFrame = CGRect(x: 0, y: 0.5, width: self.view.frame.width, height: self.originalFrame.height - kbSize)
self.view.frame = self.keyboardOpenedFrame

你在顶部看到的HTML元素是一个全屏元素,有固定的位置和100%的高度和100%的宽度,所以我猜蓝色的边距没有添加到HTML页面内部。
有什么想法吗?
//编辑:添加webview结构

struct WebView: View {
    typealias UIViewControllerType = UIViewController
    
    var body: some View {
        if #available(iOS 14.0, *) {
            WebViewRepresentable().edgesIgnoringSafeArea(.all).ignoresSafeArea(edges: .bottom)
        } else {
            // Fallback on earlier versions
            WebViewRepresentable().edgesIgnoringSafeArea(.all)
        }
    }
    
    struct WebViewRepresentable: UIViewControllerRepresentable {
        
        func makeUIViewController(context: UIViewControllerRepresentableContext<WebView.WebViewRepresentable>) -> UIViewController {

            return WebViewController()
        }

        func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<WebView.WebViewRepresentable>) {
        }
    }
}
vngu2lb8

vngu2lb81#

更改WKWebView的滚动视图的内容插图:

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardHeight = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
        self.webViewController.wv.scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0 - keyboardHeight, right: 0)
    }
}

还有

@objc func keyboardWillHideß(notification: NSNotification) {
    UIView.animate(withDuration: 0.2, animations: {
        self.webViewController.wv.scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    })
}
2ekbmq32

2ekbmq322#

不需要手动计算键盘框架,因为它是由约束处理的,可以用键盘显示文本字段,所以只需要注解

//        self.keyboardOpenedFrame = CGRect(x: 0, y: 0.5, width: self.view.frame.width, height: self.originalFrame.height - kbSize)
        
//        print("[LOG] SETTING FRAME \(self.keyboardOpenedFrame)")
//        self.view.frame = self.keyboardOpenedFrame

结果行为正确(此处不应更改帧-键盘偏移在内部处理,显示TextField的正确相对位置)

使用Xcode 13.4 / iOS 15.5进行测试

zmeyuzjn

zmeyuzjn3#

this question给出了禁用WkWebView的键盘处理的方法。答案非常简单。只要删除WKWebView示例的这些观察结果。它对我来说在iOS 16上是有效的。

NotificationCenter.default.removeObserver(self.webView, name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
NotificationCenter.default.removeObserver(self.webView, name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.removeObserver(self.webView, name: UIResponder.keyboardWillHideNotification, object: nil)

我想这只是WKWebView内部观察键盘变化的方式。

相关问题