5

UICollectionViewと 2 つのサブクラスがありUICollectionViewFlowLayoutます。セルが選択されたらsetCollectionViewLayout:animated:、レイアウトを切り替えるために呼び出します。トランジションが完了すると、選択したセルが中央に配置されますが、これで問題ありません。

セルを実際に選択せずに、同じセンタリング動作を実行できますか? さまざまなメソッドを呼び出そうとしましたがsetContentOffset:animated:、成功しませんでした。contentOffsetまたは、表示するレイアウトに自己定義を指定できますか?

selectedより明確にするために、セルのプロパティを変更せずに次のようにしたいと思います。ここに画像の説明を入力

編集#1

これは私がすでに持っているものです:

[self.collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
[self.collectionView setCollectionViewLayout:layout animated:YES];

問題ないようです: https://www.dropbox.com/s/9u6cnwwdbe9vss0/17249646-0.mov


しかし、スキップするとselectItemAtIndexPath

[self.collectionView setCollectionViewLayout:layout animated:YES];
[self.collectionView scrollRectToVisible:targetFrame animated:YES];

これはそれほど細かいものではありません (手を振るアニメーションのようなものです): https://www.dropbox.com/s/s3u2eqq16tmex1v/17249646-1.mov

4

1 に答える 1

0

編集(さらに明確にした後に回答を変更)

テーブルビューhere で同様のことを行いました。基本的に、scrollRectToVisible:animated:スクロールビューを最終的に配置したい場所に配置する四角形を計算することを呼び出します。正確な配置については、ビューと同じサイズの四角形を計算するだけでよいと思います。コンテンツ サイズが変更される場合、予想される最終的なコンテンツ サイズで rect を計算する必要があることに注意してください。

元の答え

layoutAttributesForElementsInRect:rect次のようなものでオーバーライドすることにより、スーパークラスによって生成されたレイアウトを変更できます。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *poses = [super layoutAttributesForElementsInRect:rect];
    if (<test whether we want to modify poses>) {
        UICollectionViewLayoutAttributes *pose = poses[<index of pose to be modified>];
        pose.frame = <some other frame>;//modify the frame, for example
    }
    return poses;
}

layoutAttributesForItemAtIndexPath同様のロジックでオーバーライドする必要もあります。次のステップは、変更が必要なときにレイアウトを無効にするか、置き換えることです。また、いくつかの情報を渡す必要があります。レイアウトは何をすべきかを知る必要があるため、関連するデータを渡すか、拡張することができますUICollectionViewDelegateFlowLayout1

于 2013-06-22T15:48:32.960 に答える