iAd Landscape奇怪的观看行为

时间:2011-04-26 02:00:57

标签: iphone ios iad

我有一个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 个答案:

答案 0 :(得分:5)

我不知道这是否解决了您的所有问题,但根据this question上的答案,测试广告只是纵向,真实广告会以两种方向显示。

答案 1 :(得分:0)

我知道这个问题有点旧,所以我会在这里张贴以防万一有人遇到同样的问题(我做过)。

ADBannerView混淆了父视图的框架和变换属性,所以你要做的就是在它完成后将它们重置为原始值(在bannerViewActionDidFinish:中)。

我仍然不明白为什么它不会像完成后那样放回一切。我们不应该这样做。

答案 2 :(得分:0)

这也让我疯了。仅将横向整页广告投放到iPad并将图像传送到iPhone而不是这样说就是在寻找麻烦。我放弃使用iAdSuite代码,这导致Landscape 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上都能正确处理方向。但是,在测试广告被解雇后,屏幕会假定方向正确,所以我希望一切正常。