UICollectionViewを指定のセクションまでスクロールする方法

公開: 2016-02-11 00:18
更新: 2016-08-31 08:55

どうもこんにちは。あっきぃです。

最近は無料のネットラジオでJPOPばっかり聴いてます。

あと肉のハナマサの「プロ仕様」ってな食材の何が「プロ仕様」なのかが気になってます。



ということで、複数のSectionに分かれたUICollectionView。

ポチッとショートカットボタン的なのを押すとそのセクションの先頭に移動させたいです。



UICollectionViewLayoutAttributesを使う

UICollectionViewLayoutAttributes?なんだそれ?

我らのStack Overflowに書いてありました。流石です。teratailなんて目じゃないです。

⇒ ios - Scroll UICollectionView to section header view - Stack Overflow



iOS6から存在していたみたいですね。

調べてもよくわからないので、とりあえず解決方法だけ。



例えば横向きスクロールのコレクションの場合で、
Sectionが2の先頭へスクロールさせたい時はこんな感じ。

NSIndexPath *ip = [NSIndexPath indexPathForItem:0 inSection:2];
UICollectionViewLayoutAttributes *attributes = [collectionView layoutAttributesForItemAtIndexPath:ip];
CGFloat x = MIN(MAX(0, attributes.frame.origin.x), collectionView.contentSize.width - collectionView.frame.size.width);
[collectionView setContentOffset:CGPointMake(x, 0) animated:YES];

iOS8、iOS9で動作確認済みです。

ちなみに途中のMIN(MAX(a, x), b)は、

a <= x <= b の範囲に値を絞るってな感じを1行で表してる小技です。

(※ただし、a <= b とする。)



同様に、

縦向きのスクロールでSection4の先頭へ行きたい場合は

NSIndexPath *ip = [NSIndexPath indexPathForItem:0 inSection:4];
UICollectionViewLayoutAttributes *attributes = [collectionView layoutAttributesForItemAtIndexPath:ip];
CGFloat y = MIN(MAX(0, attributes.frame.origin.y), collectionView.contentSize.height - collectionView.frame.size.height);
[collectionView setContentOffset:CGPointMake(0, y) animated:YES];

これでOKです。

簡単なもんですな。

(自力でごちゃごちゃ計算してた。。)



この記事をシェア
この記事にコメントする
書き込む
あっきぃ(@appstars_aki)
Web、iOSなフリーランサーです。好きなものはお寿司です。でもお寿司は高いので普段は雑草とか拾ったドングリを食べています。お仕事や意味もなく毎月お小遣いをくれる人を探してます。

お仕事の依頼や自分で作ったアプリのレビューを希望しちゃう方はaki@appstars.jpまでご連絡ください。