iOS テーブルのセルがタブにめり込む問題

下記の画像のようにテーブルビューの一番下のセルがタブにめり込んで出てこないのはなんでだろうと思って調べました。

f:id:konohazukux:20180527144143g:plain

次の3つのパラメーターの設定方法に問題があったみたい。

■ isTranslucentの設定

 Translucent は 半透明とのこと。
 ナビバーやタブバーに設定するもので背景を半透明に透過するかを指定する。 

navigationController?.navigationBar.isTranslucent = false // ナビバーを半透明にしない   
tabBarController?.tabBar.isTranslucent = false // タブバーを半透明にしない

■ extendedLayoutIncludesOpaqueBars の設定

 extended Layout   Includes  OpaqueBars   
 拡張   レイアウト  含める   不透明な部分  

 不透明な部分を拡張レイアウトに含めるかどうか

extendedLayoutIncludesOpaqueBars = true

の場合はナビバーやタブバーを半透明にしなかった場合にもナビバー、タブバーの部分を拡張レイアウトに含める。

■ edgesForExtendedLayout の設定

    edges  For     Extended  Layout      
    端っこ のための     拡張           レイアウト  

どこを拡張レイアウト用の端とするか。
edgesForExtendedLayout = .all

つまり

  • タブバーを半透明にしないで、
  • 不透明な部分も拡張レイアウトに含めて、
  • 拡張レイアウトを下端にも適用させる。

といった設定になっている場合にタブの下にセルがめり込んで最後のセルが出てこないといった問題が発生する。

問題の発生するコードを掲載します。

//
//  SampleViewController.swift
//

import UIKit

class SampleViewController: UIViewController {
    
    let sampleDatas = ["1","2","3","4","5","6","7","8","9","0","1","2","3","4","5","6","7","8","9","0"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        title = "タブ1"

        // 1. ナビバー、タブバーを半透明にするかの設定
        navigationController?.navigationBar.isTranslucent = false
        tabBarController?.tabBar.isTranslucent = false
        
        // 2. 半透明ではない部分も拡張レイアウトに含めるかの設定
        extendedLayoutIncludesOpaqueBars = true
        
        // 3. どの部分が拡張レイアウトの対象となるか
        edgesForExtendedLayout = .bottom
        
        let tableView = UITableView()
        tableView.dataSource = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

        view.addSubview(tableView)
        
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    }
}

extension SampleViewController: UITableViewDataSource {
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sampleDatas.count
    }
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = sampleDatas[indexPath.row]
        if indexPath.row % 2 == 0 {
            cell.backgroundColor = UIColor(red: 0.5, green: 0.5, blue: 1, alpha: 1)
        } else {
            cell.backgroundColor = UIColor(red: 0.5, green: 1, blue: 0.5, alpha: 1)
        }
        return cell
    }
}