概要
UIViewControllerにUITableViewと広告バナーを貼るのは至極簡単なのですが
UITableViewControllerに広告バナーを貼るのはかなり遠回りをしなければならなかったので
どうしてもUITableViewControllerでバナー入りの画面を作りたい!という方の為に方法を書きます。
やりたかったこと
UITableViewControllerの下に広告バナーを差し込みたかった。
UITableViewのスクロールは広告バナーの上までにしたい。
何が面倒だったか
- ベースがUIViewではなくUITableViewなので
self.view addSubView
をするとスクロールにUIViewが追従してしまう - 広告バナーの上までをスクロール領域にする
- UITableViewにaddSubViewするとUIViewに罫線が入ってしまう
などなど…これら全てをクリアしなければなりませんでした。
どうやって回避したか1つずつ書いていきます。
self.view addSubView
をするとスクロールにUIViewが追従してしまう
UITableViewのframeがViewDidAppear以外で変えれないので
これはもうaddSubViewする以外に方法がなかったです。なのでまずはaddSubViewします。
そのあと、UIScrollViewのscrollViewDidScrollでスクロール量に合わせて位置を固定するように座標を書くことで回避できました。
- (void)scrollViewDidScroll:(UIScrollView *)s {
adView.frame = CGRectMake(adView.x + s.contentOffset.x,
adView.y + s.contentOffset.y,
adView.width,
adView.height);
}
これでひとまず固定が出来ます。
広告バナーの上までをスクロール領域にする
これはaddSubViewしてしまうとなると、UITableViewのcontentInsetをいじるしかありません。
- (void)viewDidLoad {
tableView.contentInset = UIEdgeInsetsMake(0.f, 0.f, adView.height, 0.f);
tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0.f, 0.f, adView.height, 0.f);
}
こんな感じでバナー分上にあげてあげればそこまでしかスクロールしないようになります。
UIEdgeInsetsは3番目が高さになるので注意です。
UITableViewにaddSubViewするとUIViewに罫線が入ってしまう
これはちょっとなぜこの現象が起きるかわからなかったのですが、
UIViewのalphaを変えても色をつけてもUITableViewの罫線がUIViewが透けているかのように
スクロールにあわせて動いていってしまいました。
UIViewの階層を確認するとUITableViewと同じレイヤーにいることがわかったので
zPositionを使い一段上にすることで固定することができるようになりました。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.adView.layer.zPosition = 1; // ここで階層を1つ上に
}
これでスクロールにも追従しないし、スクロールもちょうどいい位置で止まるし、
罫線も透けないで完璧です!
その他はまりどころ
UITableViewControllerのself.viewの高さはtoolbarやstatusBarの高さが考慮されます。
バナーをぴったりの位置に貼る時にはここを注意してください。
いろいろやったけども本当に面倒だった
UITableViewControllerを使うぐらいならUITableViewを使って
単純にUITableViewの大きさを縮めた方が絶対に楽です。。
理由があってこの方法を使うのであれば、ぜひ参考にしてみてください!