iOS7だとiAd表示位置がズレる?!

Xcode5に無事にアップデートできたのですが
これまで制作したアプリのiAdの表示がiOS7でテストすると
表示位置がこんな感じでズレて表示されてしまいます。

iAdの表示がズレる

iAdの設置コードはこんな感じで一般的なものを使ってます。

    //iAd設置処理
    CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
    adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
    adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
    adView.frame = CGRectOffset(adView.frame, 0, screenRect.size.height);
    [self.view addSubview:adView];
    adView.delegate=self;
    self.bannerIsVisible=NO;

iOS5~6では問題なく表示されていますが
iOS7だと初期状態のiAdバナーの位置がY軸が
20pixel足りなくて画面に表示されてしまう感じです。

どうやら、iOS7ではステータスバーがレイヤーで
重なるようになったので画面がズレてしまうようです。

これはエミュレーターだけの問題で
実機で表示すると問題なく表示されるかと思っていましたが
残念ながら実機でもズレるようです。

ということで、iOS7のときはiOS6のときとは
違う処理を追加しなければなりません。

幸いなことにネットで解決するためのサンプルコードが
公開されていました。

- (void)viewDidLoad
{
    [super viewDidLoad];

    if ([[[[UIDevice currentDevice] systemVersion]
         componentsSeparatedByString:@"."][0] intValue] >= 7) //iOS7 later
    {
        CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
        float heightPadding = statusBarViewRect.size.height + self.navigationController.navigationBar.frame.size.height;
        
        CGRect original = self.contentView.frame;
        
        CGRect new = CGRectMake(original.origin.x,  original.origin.y + heightPadding,
                                original.size.width,  original.size.height - heightPadding);
        
        self.contentView.frame = new;
    }
}

■iOS7でステータスバーが被る問題への対応 – Kazzzの日記
http://d.hatena.ne.jp/Kazzz/20130923/p1

この方法だとcontentViewを作成して
アウトレットする必要がありますがなかなか良いと思います。

単純にiAdの表示位置だけを直すなら
iOS7のときだけ表示位置にステータスバーの高さを
追加するコードを書いた方が簡単かも。

その場合、iAdのコード部分にある

[[UIScreen mainScreen] applicationFrame]

[[UIScreen mainScreen] bounds]

に変えるとステータスバーも含めた画面サイズになるので
iAdの表示がきちんと隠れるようになります。

タイトルとURLをコピーしました