【问题标题】:How to subclass UIScrollView of WKWebView in Swift如何在 Swift 中继承 WKWebView 的 UIScrollView
【发布时间】:2021-10-13 03:09:33
【问题描述】:

我在 Swift 中成功地继承了 WKWwebView。但现在我也想在WKWebView 中继承UIScrollView。例如。我想做这样的事情(伪代码):

class CustomWKWebview : WKWebView {
  override init(frame: CGRect, configuration: WKWebViewConfiguration) {
    super.init(frame: frame, configuration: configuration)

    self.scrollView = CustomScrollView // <-- this is what I want
  }
}

虽然这似乎是不可能的,因为 self.scrollView 被 Apple 声明为只读。

还有其他方法可以在 WKWebView 中子类化滚动视图吗?

【问题讨论】:

  • 为什么要继承一个 UIScrollView?
  • @Demented07 好问题!我必须覆盖touchesBegan 方法。我在 WKWebView 本身中做到了这一点,但为了让它工作,我必须这样做:self.scrollView.isUserInteractionEnabled = false 这阻止了 scrollView 正常工作(因为你不能再滚动了)。因此,我想改为子类化 UIScrollView 并在那里收听触摸事件。
  • 好吧,为什么你需要一个tapGestureRecignizer,你打算用它做什么? (我正在尝试查看是否可以解决您的问题)。
  • 用例有点复杂。但我会尽力解释:我在 Swift 中有两个视图:一个 GMapView 和一个 WKWebView(使用 Capacitor.js 项目)。我想让 WKWebView 在 GMapView 之上。然后我使 WKWebView 透明,以便可以看到 GMapView。这样做的好处是我可以使用 WKWebView 中的 HTML 和 CSS 完全自定义 GMapView。但是,由于 WKWebView 现在位于顶部,因此它会捕获所有触摸事件。这意味着 GMapView 不会收到任何事件。为了解决这个问题,我想使用touchesBegan 并委托这些事件。
  • 另外,您不必将 scrollView 子类化,您可以将其添加为子视图,例如 let scrollView: UIScrollView! 然后在 loadView 或其他一些适当的生命周期方法中创建子视图并将其作为子视图添加到视图中 scrollView = UIScrollView(frame: view.frame) 最后 view.addSubView(scrollView)

标签: ios swift uiscrollview wkwebview


【解决方案1】:

WKWebView的scrollView是一个特殊的内部WKScrollView类(可以通过下面的Objective-C Runtime Method来确认)。

print(object_getClass(yourWebView.scrollView))

因此,用于替换 WKWebView 的任何 scrollView 对象也必须继承自 WKScrollView。不推荐这样做,因为它是一个私有的 WebKit 框架类。使用私有 API 会导致您的应用被 App Store 拒绝(根据经验)。

看起来您最初想通过在其顶部添加 HTML/CSS 来自定义另一个视图。出现了对 scrollView 进行子类化的要求,因为您希望手势“通过”呈现 Web 内容的视图。

我建议以下解决方法。

  1. 尝试将 WebView 添加到 GMapsView 中,方法是将其添加为 GMapsView - addSubview 的子视图

  2. 假设您的“GMapsView”实际上是来自 Google Maps SDK for iOS 的“GMSMapView”,请查看他们的地图样式指南,看看它是否符合您的要求 - Google Maps for iOS SDK Style Reference

【讨论】:

  • 感谢您的回答。因此,如果我理解正确,这里的“真正”答案是:这是不可能的。不幸的是,我无法将 WebView 添加为 GMSMapView 的子视图。必须反过来做。样式选项也不是我想要的。我想在 MapView 上显示完全成熟的 HTMLElements。
  • 我想也许可以在 GMSMapView 和 WebView 之上添加一个视图。每当我在那里检测到一个触摸事件时,我都会将它们分派给两个视图。您认为这是一个有效的解决方法吗?
  • 可能是这样,但取决于 GMSMapView 和 WebView 中如何处理触摸手势。他们对触摸处理的实现在任何地方都没有记录。如果您的唯一要求是在地图顶部显示 HTML 元素,则使用 GMaps JS SDKCustom Overlays 在 WebView 内加载地图。另见Similar Question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多