TableView の高さにはborderが自動で含まれる

はじめに

UITableViewにCustomCellを配置する際に中身の要素の高さが固定で確定している状態でボーダーを表示するとコンソールに以下のような警告が表示されます。

"<NSLayoutConstraint:0x600002021d10 UIImageView:0x7fcbbcf60920.height == 48   (active)>",
    "<NSLayoutConstraint:0x600002024140 V:|-(16)-[UIImageView:0x7fcbbcf60920]   (active, names: '|':UITableViewCellContentView:0x7fcbbcf06ca0 )>",
    "<NSLayoutConstraint:0x600002024280 V:[UIImageView:0x7fcbbcf60920]-(16)-|   (active, names: '|':UITableViewCellContentView:0x7fcbbcf06ca0 )>",
    "<NSLayoutConstraint:0x600002003bb0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7fcbbcf06ca0.height == 80.3333   (active)>"

デバッガービューで確認してみる

cellの高さは画像が48、上下のmarginが16で合計80になるはずなのですが、謎の0.33が追加されていました。

ボーダーが怪しいと思ったので以下のコードを追加して再度確認してみると80.0に治っていました。

tableView.separatorStyle = .none

なぜiPhone 11 Pro では0.5の線が描画できないのか調べてみた こちらの記事にあるのですが、Frameの小数部分は実行時にPixel alignedになるように丸められるので、Scaleをかけて割る…みたいな処理が自動的に入っているらしいです。

そのため指定のiPhoneXで0.33をプラスしてエラーが消えても他の端末スクリーンサイズが変わるとエラーが出てしまいます。

解決策

解決策としてはBottomの制約のpriprityを下げることでエラーがでなくなりborderの分botoomの制約が小さくなってくれます