2012-02-28 3 views
7

У меня есть проект, который использует SDK объявлений Google AdMob. Я пытаюсь показать несколько объявлений на главной странице вместе с некоторыми другими кнопками, некоторые из которых находятся под экраном.UIScrollView не прокручивается при касании GADBannerView subview

Я использовал UIScrollView и добавил несколько GADBannerViews из DFP внутри, а также кнопки. Реклама загружается просто отлично, и я могу без проблем нажимать на объявления и кнопки.

Проблема заключается в том, что я пытаюсь прокрутить прокрутку. Если я начну касаться объявления, просмотр прокрутки не будет прокручиваться. Если я начну касаться где-нибудь еще, например кнопку или пустое пространство, свиток прокручивается правильно. Кажется, что объявление каким-то образом контролирует сенсорные события.

Я пробовал всевозможные исправления, такие как создание прозрачного UIView над рекламой, что не сработало, потому что краны не регистрировались.

Я пробовал перемещаться по подзонам GADBannerView, но все классы subviews кажутся проприетарными для AdMob или недоступны. (GADWebView, _UIWebViewScrollView)

Я даже попытался добавить объявление в UITableView, чтобы увидеть, будет ли оно прокручиваться там, но оно тоже не работает.

Класс контроллера класса просмотра довольно большой, поэтому, если вам нужно, чтобы я опубликовал код, я могу создать пример приложения, чтобы продемонстрировать проблему. Обходным решением пока является создание UIWebViews с кодом HTML-кода внутри вместо использования GADBannerView. Я тестировал это, и он работает, но я действительно не хочу потерять функциональность собственного метода.

Есть ли способ прокрутить UIScrollView, если вы начнете касаться GADBannerView и разрешите рекламе оставаться доступной?

Спасибо!

ответ

0

К сожалению, нет способа переопределить жест прокрутки, но сохраняйте жест касания для объявления. Сам GADBannerView должен сам контролировать все жесты. Также нет возможности программно отправить клик на GADBannerView, чтобы вы не могли переопределить поведение касания.

Я бы рекомендовал использовать объявления, которые намного меньше, чем ваш UIScrollView, поэтому вам не нужно слишком беспокоиться о прокрутке объявления.

+0

Вот что я подумал, но думал, что я все равно спрошу. Спасибо за информацию. –

+3

Собственно, это возможно. См. Ответ Джейкоба Дженнинга в этой теме] (http://stackoverflow.com/a/10274683/1914). –

9

Эта проблема может быть решена путем создания подклассов UIScrollView, в соответствии с протоколом UIGestureRecognizerDelegate и возвращение YES из

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

Вам не нужно установить делегат; UIScrollView уже установлен как делегат его распознавателей жестов по умолчанию.

+1

не может заставить это работать для uitabelview :( –

+0

@SjoerdPerfors действительно нашел решение для работы с UITableViews? –

+0

@JayQ. Ну, я еще не видел его устаревшим, поэтому, если класс SwipeableBanner ушел не знаю. http://stackoverflow.com/a/20521939/981968 –

3

Проблема заключается в конфликте между распознающим жестом в UIWebView, используемом GADBannerView, и пользовательским распознавателем в 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

+0

Это может быть не самое элегантное решение, но оно работает без подкласса UIScrollView. – jfuellert

+0

это дает мне теперь прокручиваемое баннер вместо прокручиваемого стола. –

2

Для DFP вы можете использовать DFPSwipeableBannerView вместо DFPBannerView. Не знаете, как работает orignal GADBanner, но это должно быть одинаково. Работает в UITableView.

+0

Кто-нибудь знает, что мы должны делать в будущем, теперь, когда Google устарел DFPSwipeableBannerView в выпуске исправления ошибок, даже не упоминая об этом в примечаниях к выпуску? на я горький ... –

+0

@SamiSamhuri вы нашли решение для этого? –

+0

@JayQ. Я просто использую DFPBannerView сейчас. Он должен вести себя одинаково и отлично работает для меня. Если бы они упоминали, что в то время я бы не расстроился из-за этого. –

0

Я решил это рыть вниз в GADBannerView и установки делегата для своих веб-браузер просмотра жестов моего собственной точки зрения, а затем просто возвращение YES для всех одновременной обработки жеста:

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

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

Тогда просто вернуться да в следующий делегатский метод:

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

Я столкнулся с тем же вопросом, но решил более простое решение. Я обнаружил, что просто отключить возврат к просмотру веб-представления объявлений позволило разрешить прокрутку родительского элемента, когда было затронуто объявление. Поскольку объявление имеет тот же размер, что и веб-просмотр, единственное, что сделал 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 как подвид в contentView пользовательской ячейки в виде таблицы.

По какой-то причине подключение IBOutlet, определенного в моем классе ячеек к представлению в ячейке моей раскадровки, заставило прокрутку начать работу. Розетка просмотра даже не использовалась и была полностью отделена от вида баннера - даже удаление его из своего супервизора позволило работать с прокруткой. Просто наличие выхода, определенного и связанного с чем-то, сделало трюк.

Хотел бы я объяснить, почему это работает, но это остается загадкой iOS.

Смежные вопросы