この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
TableViewController
のview
にaddSubView
した時に意図していなかったUIになっていた為、対応しました。
環境
- Xcode 13
コード
viewDidLoad
でImageView
をUITableViewController
のview
にaddSubView
しています。
この内容でビルドするとどんな結果になるでしょうか?
import UIKit
class TableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
let imageView = UIImageView()
imageView.image = UIImage(named: "adult")
imageView.frame.size = CGSize(width: 200, height: 200)
imageView.center = view.center
view.addSubview(imageView)
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 6
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 6
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return String(section)
}
override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
guard let headerView = view as? UITableViewHeaderFooterView
else { fatalError() }
headerView.tintColor = .black
headerView.textLabel?.textColor = .white
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
else { fatalError() }
return cell
}
}
結果
addSubView
したImageView
よりTableView
のセクションが前面に来てしまい、目を覆ったような状態になってしまいました。
Debug View Hierarchy
どのような状態になっているかビュー階層を見てみることにしました。
案の定、追加したImageView
よりTableView
のheaderView
が前面になっていることにより、意図しない目を隠されているような状態になってしまいました。
対応
viewDidAppear
でbringSubViewToFront
メソッドを使い、ImageView
を最前面に表示します。
class TableViewController: UITableViewController {
private var imageView = UIImageView()
override func viewDidLoad() {
super.viewDidLoad()
imageView = UIImageView()
imageView.image = UIImage(named: "adult")
imageView.frame.size = CGSize(width: 200, height: 200)
imageView.center = view.center
view.addSubview(imageView)
}
override func viewDidAppear(_ animated: Bool) {
view.bringSubviewToFront(imageView)
}
// 以下省略
bringSubviewToFront
UIView
のインスタンスメソッドで、パラメーターに渡したsubView
をsubViews
の配列の最後尾に移動させることが出来ます。
func bringSubviewToFront(_ view: UIView)
そうすることによって、パラメーターで指定されたsubView
が親Viewの最前列に表示されます。
結果
補足
実はこの現象はUITableViewController
を使用した時のみに発生している現象で、通常のUIViewController
にUITableView
を配置し、addSubView
した場合では、セクションが前面に表示されることはなく意図した通りの表示になっていました。
おわりに
罪のない人が何かやってしまった風になってしまいそうでしたが、セクションのViewを背面にすることができ、問題を無事に解決出来てよかったです。