1

データソースを変更して、コレクション ビューに表示されているデータを交換しています。これは、タブのようなインターフェースの一部として行われています。新しいデータがロードされたら、スクロール インジケーターを点滅させて、ビューポートの外にさらにデータがあることをユーザーに伝えたいと思います。

すぐに

コレクション ビューがまだデータをロードしていないため、すぐに実行しても機能しません。

collectionView.dataSource = dataSource2;
[collectionView flashScrollIndicators]; // dataSource2 isn't loaded yet

ディスパッチ_非同期

後で呼び出しをディスパッチしてflashScrollIndicatorsも機能しません。

collectionView.dataSource = dataSource2;
dispatch_async(dispatch_get_main_queue(), ^{
    [collectionView flashScrollIndicators]; // dataSource2 still isn't loaded
});

performSelector:withObject:afterDelay:

時間遅延の後に実行するとflashScrollIndicators機能しますが(SOの別の場所で見ました)、スクロールインジケーターが表示されると少し遅れます。遅延を減らすことはできますが、競合状態につながるだけのようです:

collectionView.dataSource = dataSource2;
[collectionView performSelector:@selector(flashScrollIndicators) withObject:nil afterDelay:0.5];

コレクション ビューが新しいデータを取得してコンテンツ ビューのサイズを変更するとすぐにスクロール インジケーターを点滅させるためにフックできるコールバックはありますか?

4

2 に答える 2

3

サブクラス化UICollectionViewとオーバーライドlayoutSubviewsは解決策になる可能性があります。[self flashScrollIndicators]コレクションを呼び出すことができます。問題はlayoutSubviews、複数のシナリオで呼び出されることです。

  1. 最初にコレクションが作成され、データソースが割り当てられたとき。
  2. スクロールすると、ビューポートを超えるセルが再利用され、再レイアウトされます。
  3. 明示的にフレームを変更/コレクションをリロードします。

これを回避するには、データソースのリロード時にのみBOOL作成されるプロパティを保持します。それ以外の場合は残ります。したがって、スクロール バーの点滅は、コレクションをリロードするときにのみ明示的に発生します。YESNO

ソースコードに関しては、

MyCollection.h

#import <UIKit/UIKit.h>

@interface MyCollection : UICollectionView

@property (nonatomic,assign) BOOL reloadFlag;

@end

MyCollection.m

#import "MyCollection.h"

@implementation MyCollection

- (void) layoutSubviews {
    [super layoutSubviews];
    if(_reloadFlag) {
        [self flashScrollIndicators];
        _reloadFlag=NO;
    }
}

使用法は

self.collection.reloadFlag = YES;
self.collection.dataSource = self;
于 2013-06-19T11:40:15.367 に答える