UIScrollView не прокручивается при прикосновении к подвиду GADBannerView - PullRequest
7 голосов
/ 28 февраля 2012

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

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

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

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

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

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

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

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

спасибо!

Ответы [ 8 ]

9 голосов
/ 23 апреля 2012

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

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

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

3 голосов
/ 16 мая 2013

Проблема в конфликте между распознавателем жестов в 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;
}
2 голосов
/ 04 мая 2016

Я столкнулся с этой проблемой при попытке добавить DFPBannerView в качестве подпредставления contentView пользовательской ячейки в табличном представлении.

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

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

2 голосов
/ 05 августа 2014

Мне пришлось объединить два ответа выше:

   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 голосов
/ 11 декабря 2013

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

0 голосов
/ 14 июля 2014

Я столкнулся с той же проблемой, но выбрал более простое решение. Я обнаружил, что простое отключение показа объявления в Интернете позволяет прокручивать родительский вид прокрутки должным образом при касании объявления. Поскольку размер объявления совпадает с размером веб-просмотра, единственное, что делал gestRecognizer, - это отображал поведение возврата. Просто пришлось отключить это и оставить текущий gestRecognizer на месте.

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

            webView.scrollView.bounces = NO;     
        }
    }
}
0 голосов
/ 19 апреля 2014

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

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 голосов
/ 29 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...