スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

UICollectionViewの一部が反応しなくなるバグ

開発メモ。

UICollectionViewは大変便利な機能の一つですが、その分多くの機能を有し、メモリリークしたりとまだまだ開発段階な印象があります。

Googleで「UICollectionView メモリリーク」で一番上にきたものを引用。

https://github.com/sawat/CVCLCustomLayouts

iOS6.0.1において、UICollectionViewLayoutのデコレーションビューの生成と再利用に バグがあるようです。具体的に言うと、スクロールアウトして非表示になったデコレーションビューの インスタンスが正しく再利用されず、スクロールするたび、無限にインスタンスが生成され再利用プールに キャッシュされるようです(広義のメモリリーク)。



とまぁ色々ありますが、他にもバグを発見。

CollectionItemをタップしながらUICollectionView.reloadを呼んだ際にタップ中のCollectionItemが反応しなくなるというもの。iPadの写真アプリの実装を真似していてデバッグした際に発覚しました。
正確には、

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;

が呼ばれなくなります。
対処法は、ジェスチャー登録等で独自に判定すれば今のところ大丈夫。

[collectView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]];

して、

- (void)tapAction:(UITapGestureRecognizer*)sender
{
 NSIndexPath *indexPath = [collectView indexPathForItemAtPoint:[sender locationInView:collectView]];
 if (!indexPath) {
  // 処理
 }
}
とすれば、ちゃんと処理出来ます。

再現方法をもう少し詳しく説明すると、

アイテムを長押し状態にし、ツールバーのセグメントで別の一覧に切り替えると無反応に。

セグメントのアクションで、
[collectView reload]
が呼ばれてる辺り。タップを引きずってしまうっぽい。

標準の写真アプリではこの現象が起こらないので、タップは独自に判定している模様です。

というか標準の写真アプリはかなり複雑なことをやっているので、下手に真似しようとすると苦労します。それでもタップに問題があり、写真のスクロール中にタップを変にすると、横の写真と画面が重なったりします。なんだがバグっぽく見えます。どんなViewで作ってるのか実装のヒントになりますが。

というわけで、今まで

- (NSIndexPath *)indexPathForItemAtPoint:(CGPoint)point;

って要らなくね?

と思ってましたがこんなトコロで重宝しました。
関連記事

コメントの投稿

非公開コメント

プロフィール

エロぺんぎん

管理人:エロぺんぎん
不純な動機でプログラマーになった男、エロぺんぎんです。ブラザー達を猛烈に応援したい気持ちと、自分もプログラマーとして成長したい思いで、当ブログを立ち上げました。
エロぺん動画を運営しております。

検索フォーム
Twitter
最新記事
最新コメント
カテゴリ
リンク
RSSリンク
エロぺん動画で人気の動画
人気の記事
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。