Анимация iAd внутри и снаружи без отключения предупреждения - PullRequest
2 голосов
/ 13 февраля 2012

Я анимирую (на 0,5 секунды) баннер iAd в нижней части экрана, а затем по завершении удаляю его из своего суперпредставления.

Пока у меня есть анимация, появляется заработок препятствий iAdконсоль:

ADBannerView: ВНИМАНИЕ! В представлении баннера есть реклама, но она может быть скрыта.Это сообщение печатается только один раз за просмотр баннера.

Код прост: (проблема в строке анимации)

[UIView animateWithDuration:0.5 animations:^{
    self.adBannerView.frame = CGRectSetY(self.adBannerView.frame, viewHeight);
} completion:^(BOOL finished) {
    [self.adBannerView removeFromSuperview];
}];

Если я просто проигнорирую сообщениеПовлияет ли это на количество объявлений или что-либо еще, что получает мое приложение?

Это также происходило, когда я анимировал появление объявления с помощью метода делегата -(void)bannerViewDidLoadAd:(ADBannerView *)banner, я мог только остановить отображение предупреждения, сохраняяанимация с использованием варианта will этого метода.

Каким образом осуществляется анимация iAds на экране и за его пределами?

Ответы [ 2 ]

5 голосов
/ 24 октября 2012

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

Вот иерархия представлений, которую я имею:

UIView (same size as your iAd)
|_ iAd (make sure to pin the height and width if using iOS 6 auto layout)
|_ UIView (I create this dynamically and use it's presence to determine whether I should show or hide the iAd from the delegate)

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

- (void)hideAdBanner {
    if (!__adBannerReverseSideView) {
        __adBannerReverseSideView = [[UIView alloc] initWithFrame:__adBannerView.frame];
        __adBannerReverseSideView.backgroundColor = [UIColor blackColor];
        __adBannerReverseSideView.opaque = YES;

        [UIView transitionFromView:__adBannerView toView:__adBannerReverseSideView duration:0.3
                options:UIViewAnimationOptionTransitionFlipFromBottom | UIViewAnimationOptionCurveEaseInOut
                completion:^(BOOL finished) {
                    [UIView animateWithDuration:0.3  animations:^{
                        __adBannerBottomConstraint.constant += __adBannerContainerView.frame.size.height;
                        [self.view layoutIfNeeded];
                    }];
                }];
    }
}

- (void)showAdBanner {
    if (__adBannerReverseSideView) {
        [UIView animateWithDuration:0.3
            animations:^{
                __adBannerBottomConstraint.constant -= __adBannerContainerView.frame.size.height;
                [self.view layoutIfNeeded];
            }
            completion:^(BOOL finished) {
                [__adBannerView setNeedsLayout];
                [UIView transitionFromView:__adBannerReverseSideView toView:__adBannerView duration:0.3
                        options:UIViewAnimationOptionTransitionFlipFromTop | UIViewAnimationOptionCurveEaseInOut
                        completion:^(BOOL finished) {
                           [__adBannerReverseSideView removeFromSuperview];
                            __adBannerReverseSideView = nil;
                        }];
            }];
    }
}

Код скрытия переводит баннер AD в «обратный» вид. Вы можете изменить типы анимации с помощью параметра options.

Код показа переходит в другую сторону (из «обратного» представления в баннер AD). Вся анимация происходит с суперпредставлением, размер которого совпадает с размером рекламного баннера. Таким образом, весь ваш вид не будет анимирован.

Оставьте iAd в суперпредставлении, не удаляйте его. Это может быть основной причиной предупреждения, но я не уверен.

Тогда вот мои методы AD Delegate:

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error {
    [self hideAdBanner];
}

- (void)bannerViewDidLoadAd:(ADBannerView *)banner {
    [self showAdBanner];
}

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

Что касается закрепления высоты и ширины представления рекламного баннера в автоматическом макете iOS 6, если вы этого не сделаете, когда анимация iAd вернется на место, верхний левый угол сместится вниз и вправо на половину высота и ширина его суперпредставления каждый раз, когда он возвращается в поле зрения. :) Прикольные вещи.

0 голосов
/ 13 февраля 2012

Предупреждение не принесет ничего плохого вашему приложению. Объявления будут загружаться независимо от того, будут ли они вызваны на экране, и будут вызваны методы делегата. Вы делаете это правильно. Предупреждение - это всего лишь предложение, потому что некоторые люди могут захотеть, чтобы объявление показывалось, несмотря на определенные размеры просмотра и тому подобное, поэтому оно просто предполагает, что объявление всегда должно быть на экране. Но опять же, это предположение, а не ошибка.

...