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