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

関連記事

20140724-103334.jpg

iPhoneアプリ開発にオススメの本10選(2014年7月版)

@akio0911です。2013年12月に「レベル・目的別!iPhoneアプリ開発おすすめ本

記事を読む

20150406-121104.jpg

【アプリ開発】選んだ色をUIColorの生成コードに変換できる「Developer Color Picker」

選んだ色をUIColorの生成コードに変換できる「Developer Color Picker」

記事を読む

20160804-193842.jpg

【Xcode 7】Storyboardで複数の制約をまとめて追加する方法

Xcode 7のStoryboardで、複数の制約をまとめて追加する方法について解説します!

記事を読む

I20150808-104713.jpg

【Xcode】シミュレーターリストの表示がおかしくなった時の解決方法

Xcodeのシミュレーターリストの表示が、上のスクリーンショットのようにおかしくなってしまっ

記事を読む

iPhoneゲームを簡単に開発したいならこの本がオススメ!「Sprite Kit iPhone 2Dゲームプログラミング」

iPhoneゲームアプリを簡単に開発したいなら「Sprite Kit iPhone 2Dゲームプ

記事を読む

20160509-200435

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

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

記事を読む

20141225-223049.jpg

【Xcode6】Auto Layoutで制約のFirst ItemとSecond Itemを逆にする方法

一度追加した制約のFirst ItemとSecond Itemを入れ替える方法について紹介します

記事を読む

20141228-232009.jpg

【Swift】as?演算子を使ったキャストでは結果がoptionalとなる

今日はSwiftのas演算子とas?演算子について解説したいと思います。as演算子について

記事を読む

20150525-224340.jpg

【Swift】クロージャをメソッドや関数の引数として渡す方法

Swiftでメソッドの引数としてクロージャを渡す方法について解説したいと思います。     

記事を読む

20140807-182914.jpg

【アプリ開発】iOS 8とiOS 7でUIAlertController・UIAlertView・UIActionSheetを切り替えて使う方法

@akio0911です。今までお世話になったUIAlertViewとUIActionShee

記事を読む

20170423-182541
良肌研究室のフェイスウォッシュとオールインワンジェルを使ってみた

株式会社ブラシナさんから、良肌研究室の商品をご提供頂いたので、

I20170228-002742.jpg
約3ヶ月で体脂肪率を6.2%も落とせたキッカケについて

(右上の赤枠内がダイエット開始前、左下の赤枠内が3ヶ月後の数値

I20161224-174949.jpg
「季節の野菜を直接配送!季節のスムージー」を買ってみた

「FiNCモール」で、「季節の野菜を直接配送!季節のスムージー」を

I20161002-152537.jpg
【メンズネイル】東京・新宿のネイルサロンでマットネイルしてもらった

2016年7月18日、東京・新宿のメンズOKなネイルサロン「Tot

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

UITabBarControllerで、タブバーアイコン非選択時の

→もっと見る

PAGE TOP ↑