はじめに
自作アプリの改修をしていて,広告のViewのコードのところで
ん?と思ったので Debug View Hierarchy で見てみたところ
やっぱり二重に表示されていた。そのときの修正について備忘録。
画面上だとわからないけど,見事に 2 つ表示されている・・・
Debug View Hierarchy に関してはこちらをご覧ください。
[Xcode]なぜ表示されない・・・ビルドしたアプリのViewの重なりをXcodeで確認する方法 - Qiita
原因と対策
原因
viewWillAppear と viewDidLoad で 広告の view を作成し,
表示するメソッドがそれぞれ呼ばれていた。つまり,2 つ分表示される。
対策
メソッドは両方から呼ばれてほしいので,どちらかでメソッドを呼ばない選択肢はない。よってすでに 広告 View が下地(addSubView される View) に addSubView されているかを判断して,されていれば何もしないようにした。
// すでに表示されてない
if (![addSubViewするView isDescendantOfView:addSubViewされるView]) {
// 広告View生成
} else {
//Nope
}
Swift もおそらく同じ。
実際のコード(nend)
# pragma mark - View Ads method
// 広告表示関数
- (void)viewAds {
// (2) NADView の作成
if (![self.nadView isDescendantOfView:self.view]) {
if ([Util isIPADPRO]) {
self.nadView = [[NADView alloc] initWithFrame:CGRectMake(523, 0, 320, 50)];
} else {
self.nadView = [[NADView alloc] initWithFrame:CGRectMake(352, 0, 320, 50)];
}
// (3) ログ出力の指定
[self.nadView setIsOutputLog:YES];
// (4) set apiKey, spotId.(省略)
[self.nadView setNendID:@"hoge" spotID:@"hoge"];
[self.nadView setDelegate:self]; //(5)
[self.nadView load]; //(6)
[self.view addSubview:self.nadView];
} else {
NSLog(@"何もしない何もしない");
}
}
【追記】
コメントでご指摘いただいた View の nil チェックの方がスマートな気がします。
Nend は手順通りにやれば比較的早く導入できる。ただ,日本語環境だといいけど英語環境だと表示する広告はないとエラー吐くのでため息になる。
iAd は導入自体は容易だけど表示されないときの処理書いたり色々面倒。
おわりに
表示させる View がすでに addSubView されているか調べる方法について実際の例を交えて書いた。Storyboard の VC に広告用の UIView を貼った方が早い気もする。このアプリ 1 年くらい前の私がコード書いてるんだけどしっかりしてくださいよって言いながらいい感じにツッコミながら作業できている。少しは成長したのだと思いたい。
ご覧いただき,ありがとうございました。