iOS 10以前
テーブルビューまたはスクロールビューの表示されている高さを取得する場合は、テーブルビューの高さから上下の挿入図を差し引く必要がありました。
let tableView = ....
let height = tableView.frame.size.height - tableView.contentInset.top - tableView.contentInset.bottom
iOS 11
残念ながら、上記の方法を訴えているiOS 11では、正しい値を取得できませんでした。
デバッグを行った後、ナビゲーションバーの高さではなく、上部の挿入図が0.0であることに気付きました。
iOS 11およびUIScrollViewContentInsetAdjustmentBehavior
IOS 11でUIScrollViewContentInsetAdjustmentBehaviorが導入されたため、正しいcontentInsetを取得できません。詳細については、次のリンクを参照してください。
https://developer.Apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior
UIScrollViewContentInsetAdjustmentBehaviorが導入されたため、adjustedContentInsetプロパティを考慮して、contentInsetに追加する必要があります。
上記のコードを次のように更新する必要があります。
let visibleHeigh: CGFloat
if #available(iOS 11, *) {
visibleHeight = tableView.frame.size.height - (tableView.contentInset.top + tableView.adjustedContentInset.top) - (tableView.contentInset.bottom + tableView.adjustedContentInset.bottom)
} else {
visibleHeight = tableView.frame.size.height - tableView.contentInset.top - tableView.contentInset.bottom
}
スクロールビューのコンテンツインセットが「adjustedContentInset」の影響を受けないようにする場合は、次のコードを使用してこの予測できない動作を無効にできます。
// obj-c
if (@available(iOS 11.0, *)) {
[tableView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
// Swift
if #available(iOS 11.0, *) {
tableView.contentInsetAdjustmentBehavior = .never
}