【Swift】TableViewControllerでTableViewのセクションが最前面に来てしまうので対応した
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を背面にすることができ、問題を無事に解決出来てよかったです。