【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コード)

関連記事

20140810-193043.jpg

WordPressでObjective-Cのソースコードをキレイに整形して表示する方法

WordPressの記事内で、Objective-Cのソースコードをキレイに整形して表示する方法

記事を読む

I20160418-235604.jpg

XcodeのStoryboardで部品を選択しやすくする2つの方法

ストーリーボード上で部品が入り組んでくると選択しづらくなってきますが、そんな状況でも部品を選択し

記事を読む

20150106-142403.jpg

Auto Layoutをコードで記述してビューを等間隔に並べる【Swift】

Auto Layoutをコードで記述して、ビューを等間隔に並べる方法について紹介します。ちなみに

記事を読む

Auto LayoutやStoryboardの仕組みをしっかり理解できる!「UIKit徹底解説」

インプレスジャパン様より献本御礼。UIKit周りを中心に、「Auto Layout」「Story

記事を読む

I20160207-111059.jpg

【Swift】Xcodeで型推論された変数や定数の型を調べる方法

Swiftには、そのデータ型が明らかであれば型を明記する必要が無い「型推論」という機能があります

記事を読む

20140721-170305.jpg

プロトタイピングのツールや手法を学べる「プロトタイピング実践ガイド」

株式会社インプレスさまより献本御礼。 プロトタイピング実践ガイド スマホアプリの効率的なデザイ

記事を読む

20141222-120336.jpg

【Swift】PlaygroundでUIImageに画像を読み込む方法

SwiftのPlayground内にて、UIImageに画像ファイルを読み込む方法を紹介しま

記事を読む

I20150722-185359.jpg

【書籍】12のパターンで学ぶ本「iOSアプリ開発 AutoLayout徹底攻略」

     Auto Layoutの使い方について解説されている本「iOSアプリ開発 A

記事を読む

I20160925-163452.jpg

タブバーアイコン非選択時の色を変更する方法【iOS 10】

UITabBarControllerで、タブバーアイコン非選択時の色を変更する方法を紹介します!

記事を読む

I20150714-010114.jpg

【Swift】Objective-Cで書いたクラスをメソッド単位で少しずつSwiftへ移行する方法

Objective-Cで作った既存のアプリをSwiftで書き直したいと思っているのですが、一

記事を読む

PAGE TOP ↑