2012-02-28 132 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。

相關問題