web-dev-qa-db-ja.com

iOS11がUITableViewまたはUIScrollViewからvisibleHeightとcontentInsetを取得する

iOS 10以前

テーブルビューまたはスクロールビューの表示されている高さを取得する場合は、テーブルビューの高さから上下の挿入図を差し引く必要がありました。

let tableView = ....
let height = tableView.frame.size.height - tableView.contentInset.top - tableView.contentInset.bottom

iOS 11

残念ながら、上記の方法を訴えているiOS 11では、正しい値を取得できませんでした。

デバッグを行った後、ナビゲーションバーの高さではなく、上部の挿入図が0.0であることに気付きました。

8
zirinisp

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
}
6
zirinisp

スクロールビューのコンテンツインセットが「adjustedContentInset」の影響を受けないようにする場合は、次のコードを使用してこの予測できない動作を無効にできます。

// obj-c
if (@available(iOS 11.0, *)) {
  [tableView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}

// Swift
if #available(iOS 11.0, *) {
  tableView.contentInsetAdjustmentBehavior = .never
}
5
Lucas Chwe