【问题标题】:UIScrollView doesn't scroll when touching GADBannerView subview触摸 GADBannerView 子视图时 UIScrollView 不滚动
【发布时间】:2012-03-17 12:26:49
【问题描述】:

我有一个使用 Google AdMob 广告 SDK 的项目。我正在尝试在主页上展示一些广告以及其他一些按钮,其中一些位于屏幕下方。

我使用了一个 UIScrollView 并从 DFP 内部添加了一些 GADBannerView 以及按钮。广告加载得很好,我可以毫无问题地点击广告和按钮。

问题是当我尝试滚动滚动视图时。如果我开始触摸广告视图,滚动视图将不会滚动。如果我开始触摸其他任何地方,例如按钮或空白区域,则滚动视图会正确滚动。广告似乎以某种方式控制了触摸事件。

我尝试了各种修复方法,例如在广告上方创建一个透明的 UIView,但没有成功,因为点击无法注册。

我尝试循环浏览 GADBannerView 的子视图,但所有子视图的类似乎都是 AdMob 专有的或无法访问。 (GADWebView, _UIWebViewScrollView)

我什至尝试将广告添加到 UITableView 以查看它是否会在那里滚动,但它也不起作用。

我的视图控制器类非常大,所以如果您需要我发布一些代码,我可以创建一个示例应用程序来演示该问题。目前的解决方法是使用内部的 HTML 广告代码创建 UIWebView,而不是使用 GADBannerView。我已经对此进行了测试并且可以正常工作,但我真的不想失去本机方法的功能。

如果您开始触摸 GADBannerView 并允许广告保持可点击状态,是否有任何方法可以滚动 UIScrollView?

谢谢!

【问题讨论】:

    标签: ios uiscrollview admob


    【解决方案1】:

    我在尝试将 DFPBannerView 添加为表格视图中自定义单元格的 contentView 的子视图时遇到了这个问题。

    由于某种原因,将自定义单元格类中定义的 IBOutlet 连接到故事板单元格中的视图导致滚动开始工作。视图出口甚至没有被使用,并且与横幅视图完全分开 - 即使将其从其超级视图中删除也允许滚动行为起作用。只需定义一个插座并连接到某物就可以了。

    我希望我能解释一下为什么会这样,但这仍然是 iOS 的一个谜。

    【讨论】:

      【解决方案2】:

      我必须结合上面的两个答案:

         for (UIWebView *webView in bannerView_.subviews) {
              if ([webView isKindOfClass:[UIWebView class]]) {
                  adView = webView;
              }
      
              for (id view in [[[webView subviews] firstObject] subviews]) {
                  if ([view isKindOfClass:NSClassFromString(@"UIWebBrowserView")]) {
                      for (UIGestureRecognizer *recognizer in [view gestureRecognizers]) {
                          if ([recognizer isKindOfClass:NSClassFromString(@"UIWebTouchEventsGestureRecognizer")]) {
                              [view removeGestureRecognizer:recognizer];
                          }
                      }
                  }
              }
              webView.scrollView.scrollEnabled = NO;
              webView.scrollView.bounces = NO;
      
          }
      

      bannerView_ 是一个 GADBannerView

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,但决定采用更简单的解决方案。我发现仅禁用广告的网络视图反弹允许父滚动视图在广告被触摸时正确滚动。由于广告与 webview 大小相同,因此gestureRecognizer 所做的唯一一件事就是显示反弹行为。只需将其关闭并保留当前的手势识别器即可。

        - (void)disableBannerBounce:(GADBannerView*)bannerView{
            for (UIWebView *webView in bannerView.subviews) {
                if ([webView isKindOfClass:[UIWebView class]]) {
        
                    webView.scrollView.bounces = NO;     
                }
            }
        }
        

        【讨论】:

          【解决方案4】:

          我通过深入研究 GADBannerView 并将其 Web 浏览器视图手势的代理设置为我自己的视图来解决这个问题,然后对所有同时进行的手势处理返回 YES:

          id webBrowserView = [[[[[[adView subviews] firstObject] subviews] firstObject] subviews] firstObject];
          
          for (UIGestureRecognizer *gestureRecognizer in [webBrowserView gestureRecognizers])
          {
              [gestureRecognizer setDelegate:self];
          }
          

          然后在下面的委托方法中返回yes:

          - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
          {
              return YES;
          }
          

          【讨论】:

            【解决方案5】:

            对于 DFP,您可以使用 DFPSwipeableBannerView 代替 DFPBannerView。不确定原始的 GADBanner 是如何工作的,但这应该是一样的。在 UITableView 中工作。

            【讨论】:

            • 现在 Google 已经在错误修复版本中弃用了 DFPSwipeableBannerView,甚至没有在发行说明中提及它,有谁知道我们将来应该做什么?并不是说我很苦...
            • @SamiSamhuri 你找到解决方案了吗?
            • @JayQ。我现在只是在使用 DFPBannerView。它应该以相同的方式运行,并且对我来说工作正常。如果他们当时提到了这一点,我就不会为此感到不安。
            • @SamiSamhuri 抱歉,您是说 DFPBannerView 滚动在 UITableView 上没有问题吗?我似乎无法让它发挥作用。我正在使用最新的 SDK。
            • @JayQ。是的,它在 UITableView 中运行良好。某些广告存在问题。如果广告最终大于我们的广告单元尺寸 (300x250),则尝试开始在广告内滚动会滚动广告而不是表格视图。除此之外,它工作正常。如果您已经在滚动并滑动广告以继续滚动,则它可以正常工作。
            【解决方案6】:

            问题是 GADBannerView 使用的 UIWebView 中的手势识别器与 GADBAnnerView 中的自定义识别器之间存在冲突。 无需继承 UIScrollView 并更改手势识别器委托,您可以删除此手势识别器并将您的对象设置为自定义识别器的委托:

            - (void)preventBannerCaptureTouch:(GADBannerView*)bannerView
            {
                for (UIWebView *webView in bannerView.subviews) {
                    if ([webView isKindOfClass:[UIWebView class]]) {
            
                        for (UIGestureRecognizer *gestureRecognizer in webView.gestureRecognizers) {
                            if ([gestureRecognizer isKindOfClass:NSClassFromString(@"GADImpressionTicketGestureRecognizer")]) {
                                gestureRecognizer.delegate = self;
                            }
                        }
            
                        for (id view in [[[webView subviews] firstObject] subviews]) {
                            if ([view isKindOfClass:NSClassFromString(@"UIWebBrowserView")]) {
                                for (UIGestureRecognizer *recognizer in [view gestureRecognizers]) {
                                    if ([recognizer isKindOfClass:NSClassFromString(@"UIWebTouchEventsGestureRecognizer")]) {
                                        [view removeGestureRecognizer:recognizer];
                                    }
                                }
                                return;
                            }
                        }
                    }
                }
            }
            

            那么您应该实现同时手势识别器委托以允许同时识别:

            - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
            {
                return YES;
            }
            

            【讨论】:

            • 这可能不是最优雅的解决方案,但它不需要继承 UIScrollView 就可以工作。
            • 这给了我一个可滚动的横幅,而不是可滚动的表格视图。
            • 但是现在广告是不能点击的……那和设置视图userInteractionEnabled = NO有什么区别呢?
            【解决方案7】:

            这个问题可以通过继承 UIScrollView 来解决,符合 UIGestureRecognizerDelegate 协议,并返回 YES

            - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
            

            您不需要设置委托; UIScrollView 已经默认设置为它的手势识别器的代理。

            【讨论】:

            • @SjoerdPerfors 确实找到了一个解决方案来让它在 UITableViews 上工作?
            • @JayQ。好吧,我还没有看到它被弃用,所以如果类 SwipeableBanner 消失了,我不知道。 stackoverflow.com/a/20521939/981968
            【解决方案8】:

            很遗憾,没有一种方法可以覆盖滚动手势但保留广告的触摸手势。 GADBannerView 本身需要控制其自身的所有手势。也无法以编程方式向 GADBannerView 发送点击,因此您也无法覆盖触摸行为。

            我建议您使用比您的 UIScrollView 小得多的广告,这样您就不必过多担心滚动广告。

            【讨论】:

            猜你喜欢
            • 2014-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-10
            • 2013-10-01
            • 2014-12-18
            相关资源
            最近更新 更多