WKWebView如何在键盘显示时禁用adjustedContentInset?

3
如果我在显示WKWebView时打开键盘,它会自动将adjustedContentInset添加到ScrollView中。但问题是,如果我自己处理键盘,它仍然会添加adjustedContentInset。我该如何解决这个问题?
2个回答

11
如果您从WKWebView中移除处理键盘的观察程序,它将停止添加adjustedContentInset:
    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)

太棒了,你是怎么想到这个解决方案的?我试了很多方法来移除手动更改 WebView 框架后底部的插入物,只有这个解决方案起作用。 - undefined
1
@schmidt9老实说,我尝试了很多方法都没有成功。最后我想也许它也使用了键盘通知。幸运的是,它确实起作用了! - undefined
现在是2023年,它在我的iOS 16上仍然有效。天才的解决方案...只希望苹果不会改变它观察键盘的内部方法。 - undefined
哦,你是我的救星。 - undefined
非常好的解决方案。不幸的是,这也会禁用滚动视图内容偏移调整,导致获取焦点的网络控件被键盘遮挡并居中显示。 - undefined

0

在更改 Web 视图的自动布局约束时,当 keyboardWillShowNotification / keyboardWillHideNotification 触发时,我遇到了这个问题。

对我有效的方法:

  1. 在添加键盘事件的观察者之后,实例化 WKWebView
  2. 更改自动布局约束后,触发一次布局阶段。
let notificationCenter = NotificationCenter.default

notificationCenter.publisher(for: UIResponder.keyboardWillShowNotification, object: nil)
  .sink { [weak self] _ in
    self?.attachWebViewToKeyboard()
    self?.view.layoutIfNeeded()
  }
  .store(in: &cancellables)

notificationCenter.publisher(for: UIResponder.keyboardWillHideNotification, object: nil)
  .sink { [weak self] _ in
    self?.attachWebViewToBounds()
    self?.view.layoutIfNeeded()
  }
  .store(in: &cancellables)

webView = WKWebView(frame: .zero)

(这里我使用的是Combine,但经典的addObserver也可以。)
赞成票最多的解决方案也有效,但缺点是当元素获得焦点并打开键盘时,它还会禁用自动滚动内容偏移调整。

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