iAd Ландшафт странного вида поведения - PullRequest
8 голосов
/ 26 апреля 2011

У меня есть iAd, который отображается в верхней части полноэкранного подпредставления основного представления. IAd работает нормально в портретном режиме, и я выполнил перевод баннера iAd в альбомный режим. Эта проблема возникает, когда пользователь нажимает iAd в ландшафтном режиме. Тестовое объявление отображается в портретной ориентации, сбоку на телефоне, и когда пользователь нажимает x, чтобы отклонить iAd, представление баннера и его родительское представление выталкиваются за экран. IAd работает нормально в портретном режиме (т. Е. При его нажатии и закрытии отображается представление, содержащее баннер, которое будет отображаться в обычном режиме).

Вещи, которые я пробовал:

- (void)bannerViewActionDidFinish:(ADBannerView *)banner{
NSLog(@"Ad was closed, show the adView again");
if(UIInterfaceOrientationIsLandscape(currentInterfaceOrientation)){
    [self animateRotationToLandscape:0.3f];
}
else{
    [self animateRotationToPortrait:0.3f];
}
}

-(void)animateRotationToPortrait:(NSTimeInterval)duration{
    self.adView.currentContentSizeIdentifier =
    ADBannerContentSizeIdentifierPortrait;

    BOOL iPad = NO;
    #ifdef UI_USER_INTERFACE_IDIOM
    iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
    #endif

    if (iPad) {
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:duration];
        proUpgradeDescription.frame = CGRectMake(82,313,604,110);
        proUpgradePrice.frame = CGRectMake(313,576,142,28);
        closeButton.frame = CGRectMake(348,834,72,37);
        purchaseButton.frame = CGRectMake(313,431,142,142);
        [UIView commitAnimations];
    }
    else{
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:duration];
        proUpgradeDescription.frame = CGRectMake(20,80,280,70);
        proUpgradePrice.frame = CGRectMake(88,322,142,28);
        closeButton.frame = CGRectMake(123,403,72,37);
        purchaseButton.frame = CGRectMake(88,172,142,142);
        [UIView commitAnimations];
    }
}

Который вызывает код, который я использую для анимации поворота дисплея в портретном и альбомном режимах. Этот код не имеет никакого эффекта.

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

Ответы [ 3 ]

5 голосов
/ 27 апреля 2011

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

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

Это тоже сводило меня с ума. Доставка только горизонтальной полноразмерной рекламы на iPad и портрета на iPhone и без этого напрашивается на неприятности. Я отказался от использования кода iAdSuite, из-за которого реклама «Ландшафтный iPad» покидала экран в альбомной ориентации, даже когда устройство было в портретной ориентации!

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

В заголовочном файле:

#import "iAd/ADBannerView.h"

@property (strong, nonatomic) ADBannerView* adView;

@interface myViewController : UIViewController <ADBannerViewDelegate,

в viewDidLoad

CGRect contentFrame = self.view.bounds;
CGRect bannerFrame = CGRectZero;
bannerFrame.size = [adView sizeThatFits:contentFrame.size];
bannerFrame.origin.y = contentFrame.size.height-bannerFrame.size.height;
adView = [[ADBannerView alloc] initWithFrame:bannerFrame];
[adView setDelegate:self];
[self.view addSubview:adView];

Тогда

-(void)viewWillLayoutSubviews {
       CGRect contentFrame = self.view.bounds;
       CGRect bannerFrame=CGRectZero;
       bannerFrame.size = [adView sizeThatFits:contentFrame.size];
      if (adView.bannerLoaded) {bannerFrame.origin.y = contentFrame.size.height-bannerFrame.size.height;}
      else {bannerFrame.origin.y = contentFrame.size.height;}
      [adView setFrame:bannerFrame];}

Затем, чтобы обработать обратные вызовы из iAd, мы должны указать представлению, чтобы оно возвращало свой макет, если что-то меняется:

- (void)bannerViewDidLoadAd:(ADBannerView *)banner{
[UIView animateWithDuration:0.25 animations:^{
    [self.view setNeedsLayout];
    [self.view layoutIfNeeded];
}];}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{
[UIView animateWithDuration:0.25 animations:^{
    [self.view setNeedsLayout];
    [self.view layoutIfNeeded];
}];}

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

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

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

ADBannerView портит свойства фрейма и преобразования родительского представления, поэтомувсе, что вам нужно сделать, это восстановить их исходные значения после его завершения (в bannerViewActionDidFinish:).

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

...