2012-02-28 202 views
7

我有一个项目使用Google AdMob Ads SDK。我试图在主页上显示几个广告以及其他一些按钮,其中一些在屏幕下方。触摸GADBannerView子视图时,UIScrollView不会滚动

我用一个UIScrollView和DFP增加了一些GADBannerViews内部以及按钮。广告加载得很好,我可以点击广告和按钮,没有任何问题。

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

我试过各种修复方法,比如在广告上面创建一个透明的UIView,由于水龙头不会注册,所以无法工作。

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

我甚至尝试将广告添加到UITableView,看看它会滚动那里,但它也没有工作。

我的视图控制器类是相当大的,所以如果你需要我张贴一些代码,我可以创建一个示例应用程序来说明问题。目前的解决方法是使用HTML广告代码创建UIWebViews,而不是使用GADBannerView。我已经测试过它,它可以工作,但我真的不想失去本地方法的功能。

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

谢谢!

回答

0

不幸的是,没有一个不覆盖滚动姿态,但保留该广告的触摸手势的方式。 GADBannerView本身需要控制所有的手势。也无法以编程方式将点击发送到GADBannerView,因此您也无法重写触摸行为。

我会推荐使用比您的UIScrollView小得多的广告,因此您不必过于担心滚动广告。

+0

这就是我想通,但想我会问反正。谢谢(你的)信息。 – 2012-02-29 04:04:51

+3

其实,这是可能的。参见[雅各布詹宁在此主题中的回答](http://stackoverflow.com/a/10274683/1914)。 – 2013-02-01 23:43:20

9

这个问题可以通过继承的UIScrollView,符合该UIGestureRecognizerDelegate协议,并从

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

YES回到你不应该需要设置代理解决;默认情况下,UIScrollView已被设置为其手势识别器的代表。

+1

不能得到这一个uitabelview工作:( – 2013-12-11 14:09:04

+0

@SjoerdPerfors确实发现获得此对UITableViews工作的解决方案? – 2014-10-03 03:20:35

+0

@JayQ。好吧,我没有看到它过时还,所以如果类SwipeableBanner走了我不知道。http://stackoverflow.com/a/20521939/981968 – 2014-10-03 06:47:14

3

的问题是使用的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; 
} 
+0

这是正确的事情! – mariusLAN 2013-07-17 14:52:31

+0

这可能不是最优雅的解决方案看,但它的工作原理,无需子类UIScrollView的。 – jfuellert 2013-08-27 21:59:38

+0

这给了我现在滚动旗帜,而不是一个可滚动的tableview。 – 2013-12-11 14:07:58

2

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

id webBrowserView = [[[[[[adView subviews] firstObject] subviews] firstObject] subviews] firstObject]; 

for (UIGestureRecognizer *gestureRecognizer in [webBrowserView gestureRecognizers]) 
{ 
    [gestureRecognizer setDelegate:self]; 
} 

这时正好是在返回:

+0

有谁知道我们应该在未来的事,现在,谷歌已经过时DFPSwipeableBannerView在发布说明中甚至没有提及它的错误修复版本?不是在我苦... – 2014-07-22 21:59:10

+0

@SamiSamhuri有你找到了一个解决方案? – 2014-10-02 02:45:29

+0

@JayQ。我现在只使用DFPBannerView。它的行为应该是一样的,对我来说工作得很好。如果他们提到那时我不会对此感到不安。 – 2014-10-02 22:43:21

0

我挖下到的GADBannerView并为其Web浏览器视图手势委托设置为我自己的看法,然后就返回YES对所有同步的姿态处理解决了这个下面的代理方法:

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

我遇到了同样的问题,但决定了一个更简单的解决方案。我发现只要禁止广告的网页浏览量反弹,就可以在触摸广告时正确滚动父级滚动视图。由于广告的尺寸与web视图一样,gestureRecognizer在做的唯一的事情是显示反弹行为。只是不得不关掉它,离开了当前的gestureRecognizer。

- (void)disableBannerBounce:(GADBannerView*)bannerView{ 
    for (UIWebView *webView in bannerView.subviews) { 
     if ([webView isKindOfClass:[UIWebView class]]) { 

      webView.scrollView.bounces = NO;  
     } 
    } 
} 
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的

2

尝试添加DFPBannerView中的内容查看的子视图时,我就遇到了这个问题表视图中的自定义单元格。

出于某种原因,连接在我的自定义单元格类来定义的,在我的故事板单元的视图一个IBOutlet导致滚动开始工作。视图出口甚至没有被使用,并且是从横幅画面完全分开的 - 甚至删除它从它的父允许滚动行为工作。只要有一个定义和连接到某个东西的插座做了诀窍。

我希望我可以解释为什么这个工作,但它仍然是一个谜的iOS。

相关问题