拦截对广告视图的触摸,显示警报,根据响应继续前进

Posted

技术标签:

【中文标题】拦截对广告视图的触摸,显示警报,根据响应继续前进【英文标题】:Intecept touch on an ad view, present alert, go forward based on response 【发布时间】:2017-02-28 17:06:25 【问题描述】:

我有一个应用,它使用 Google 移动广告 SDK 在队列中显示广告。我希望能够检测用户何时点击广告(不仅仅是在滚动时触摸它)。如果我检测到他们点击了,我希望能够显示一个警报,通知用户如果他们继续,他们将离开应用程序,给他们两个选项 - 一个继续,另一个取消。如果他们选择继续,那么我不想中断他们点击广告时发生的默认操作。如果他们选择取消,我不想发生任何事情。

我已经阅读了 Apple 的文档:https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/multitouch_background/multitouch_background.html#//apple_ref/doc/uid/TP40009541-CH5-SW9

并已尝试在容器视图上覆盖 hitTest:withEvent: 以获取实际广告视图。这使我能够检测到触摸,但我无法判断是实际触摸还是只是用户滚动。此外,我无法通过警报同步停止hitTest 的返回。该函数在响应从警报返回之前完成(这是预期的)。

我也研究过合成触摸事件,但似乎非常不鼓励这样做,也许唯一的方法是使用我不想这样做的私有 API。

我觉得我在这里很接近但仍然缺少一些部分,假设我正在尝试做的甚至是可能的。

【问题讨论】:

【参考方案1】:

对于问题的第一部分,您可以在包含广告的视图顶部创建一个没有文本的清晰 UIButton,这样您就可以拦截触摸而不必担心滚动。我认为使用响应者链是错误的方法,因为您希望在检测到触摸和希望触发广告事件之间触发一个需要用户响应的事件,因此无法暂停它,让它在以后继续。

我不确定您问题的第二部分,因为我对 Google Ads 没有太多经验,但我怀疑他们已经关闭了任何允许您在没有用户交互的情况下按程序触发广告事件的方法它会使系统容易被滥用。这只是我的怀疑,可能是错误的。如果我错了,那么值得探索的途径是在 Google Ads 框架内的任何按钮上调用 sendActionsForControlEvents(如果它们暴露的话)。如果它们没有公开,您可以递归搜索您有权访问的***视图的子视图,并检查它们是否属于 UIButton 类型。有可能他们甚至不使用 UIButton 所以这可能是一个死胡同。

【讨论】:

【参考方案2】:

听起来您真正要解决的问题是防止用户在滚动时意外点击广告。假设您使用的是UIScrollView,您可以在用户滚动时禁用GADBannerView 上的用户交互,并在用户停止滚动后启用用户交互。

例如:

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) 
    banner.isUserInteractionEnabled = false


func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) 
    banner.isUserInteractionEnabled = true

您可能需要尝试不同的UIScrollViewDelegate 方法,看看哪些方法适合您。以下是完整列表:UIScrollViewDelegate

【讨论】:

我真的很喜欢这个想法,我希望它有效。是的,我们正在努力防止意外点击。 ios 自己在这方面做得很好,但有些人仍然会无意中点击。

以上是关于拦截对广告视图的触摸,显示警报,根据响应继续前进的主要内容,如果未能解决你的问题,请参考以下文章

当另一个警报出现时,警报视图关闭

在当前视图中显示警报,以及重定向到另一个视图

UITableView 在滚动时不响应某些触摸

UIScrollView下的UIButton没有响应触摸

如何检查用户之前是不是在 iOS 中查看过推送通知权限警报视图?

Swift 中显示 UIAlertcontroller 时保持键盘打开?