【iOS】特定のセルがUITableViewの表示領域内に収まっているかどうかを調べる

公開日: : iPhoneアプリ開発

20160811-173801.jpg

特定のセルがUITableViewの表示領域内に収まっているかどうかを調べる方法を紹介します。

(もしもっと良い方法があればTwitterなどでぜひ教えて下さい! ⇒ @akio0911 | Twitter

    

スポンサード リンク

「収まっている」とは?

まず、どのような状況だと「特定のセルがUITableViewの領域内に収まっている」と言えるのかを考えてみましょう。

20160811-174923.jpg

上の図で白線がUITableView、緑の四角が特定のセルだとします。

ここでは下端の条件だけ示しますが、セルの下端が白線より上にあれば「収まっている」と言えますし、セルの下端が白線より下にあれば「収まっていない」と言えるでしょう。上端の条件についても同様です。

    

特定のセルのframeを調べる

まずは判断材料として必要な「特定のセルのframe」を取得しましょう。UITableViewのメソッドである「rectForRowAtIndexPath(_:)」が使えます。以下、11行目のセルのframeを調べるコード例です。

let indexPath = NSIndexPath(forRow: 10, inSection: 0)
let cellRect = tableView.rectForRowAtIndexPath(indexPath)

    

以下に実行結果を示します。

20160811-181003.jpg

背景色がグレーのセルが、frame取得対象のセルです。

frame取得対象のセルが上の方に表示されているケース(左側)と下の方に表示されているケース(右側)で、取得したframe(cellRect)が同じ値となってしまっていますが、これは取得したframeがUITableView内での座標系だからです。

    

convertRectで別の座標系でのframeに変換する

というわけで、rectForRowAtIndexPath(_:)で取得したframeを、別の座標系でのframeに変換しましょう。

    

20160811-222212.jpg

今回の例ではUINavigationControllerの中にUITableViewControllerを収めているので、navigationController?.viewの座標系に変換してみます。以下、コードです。

let indexPath = NSIndexPath(forRow: 10, inSection: 0)
let cellRect = tableView.rectForRowAtIndexPath(indexPath)
let cellRectInView = tableView.convertRect(cellRect, toView: navigationController?.view)

    

実行結果は以下の通りとなります。

20160811-222902.jpg

先ほどと違って、スクロール位置によってセルのframeの値が異なっています。

    

収まっているかどうかをチェックする

チェックに必要な値は取得できたので、あとは判定を行うだけです。以下、コードです。

let indexPath = NSIndexPath(forRow: 10, inSection: 0)
let cellRect = tableView.rectForRowAtIndexPath(indexPath)
let cellRectInView = tableView.convertRect(cellRect, toView: navigationController?.view)

if tableView.frame.minY + tableView.scrollIndicatorInsets.top <= cellRectInView.minY 
    && cellRectInView.maxY <= tableView.frame.maxY {

    print("収まっている")
} else {
    print("収まっていない")
}

tableView.scrollIndicatorInsets.topを足しているのは、UITableViewがナビゲーションバーの下に潜り込んでいるのでそれを考慮するためです。

    

@akio0911はこう思った。

「特定のセルがはみ出ていたら画面内に収まるようスクロールする」「特定のセルが画面内に収まっていたら何かを行う」などを実現するのに使ってみてください。

    

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

関連記事

20141027-113224.jpg

【Swift】「詳解 Objective-C 2.0 第3版」の著者による「詳解Swift」が予約受付中!

「詳解 Objective-C 2.0 第3版」の筆者「荻原 剛志」さんによる新しい技術書「詳細

記事を読む

I20160204-120840.jpg

Swiftでプロトコル型に対して===演算子を使いたい時の対処法

プロトコル型の変数や定数に対して===演算子を使うと「error: binary opera

記事を読む

I20160125-104438.jpg

iPhoneアプリの開発に必要なものをまとめてみた

僕はアプリ開発講座を開催していますが、その関係もあって「iPhoneアプリを開発するには、ど

記事を読む

20140916-130550

Swiftの列挙型、switch文、網羅性チェックが素晴らしい!

アップルの新プログラミング言語「Swift」をちょっとずついじってるんですが、列挙型とswitch文

記事を読む

I20150805-182005.jpg

Swiftにおける関数型のエッセンスを学ぶために「関数プログラミング実践入門」を読み始めた

Swiftの関数型言語的な特徴についての話を各所で見るようになりましたが、自分は関数型言語の

記事を読む

20160509-200435

【Auto Layout】readableContentGuideを使わずに最大幅を定義する

iOS 9からUIViewにreadableContentGuideが追加されましたが、re

記事を読む

エディタのショートカット・Auto Layout・ブレークポイントに関する詳しい解説も!「Xcode5徹底解説」

著者の@es_kumagaiさんより献本御礼。iOSアプリ開発に用いるツール「Xcode 5」の

記事を読む

20160730-172416.jpg

Auto Layoutで非表示にした部分を詰める(トルツメ)する方法

Auto Layoutを使って非表示にしたコントロールの部分を詰める(トルツメ)方法を説明します

記事を読む

20150109-223509.jpg

【Xcode 6】対応する開き括弧と閉じ括弧を調べる方法

Xcodeで、対応する開き括弧と閉じ括弧のを調べる簡単な方法があったので紹介したいと思います!

記事を読む

I20160505-011515.jpg

iOS 9以降で使えるReadable Content Guideを試してみた

iOS 9から追加されたReadable Content Guide(readableConte

記事を読む

PAGE TOP ↑