2

CollectionView をサブクラス化し、それを使用してさまざまなカテゴリの画像のコレクションを表示しました。例: 最も人気のある、最も閲覧された。TabbarController を介して各カテゴリ/ページにアクセスします。

私が持っているクラスは次のとおりです。

メイン クラス - MediaList -要求されたメディアの種類に応じて、コレクション ビューでメディアを取得および表示するための基本クラス。

サブクラス - MostPopularと MostViewed はどちらも、メイン クラスから継承する非常に軽量なクラスです。

問題は、MostPopular から MostViewed に移動すると、コレクション ビューが最初に写真の最後のカテゴリを表示し、次に新しいカテゴリに更新することです...その結果、フリック効果が表示されます。

MediaList のサンプル コード

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.mediaCollection.dataSource = self;
    self.mediaCollection.delegate = self;
    [self getMedia];
}

(void) getMedia 
{
    NSLog(@"/////////////////////////   GETTING MEDIA  /////////////////////////");

    XMLGenerator * sharedXmlGen = [XMLGenerator sharedXmlGenerator];
    GlobalVars * sharedGlobalVars = [GlobalVars sharedGlobalVars];
    sharedXmlGen.assetFlag = _contentFilter;
    NSLog(@"The filter is: %@", _contentFilter);
    [sharedXmlGen getPhotoVideoWithCallBackFunction:^{
    [_mediaCollection performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}];
}

SubClass (MostPopular) のサンプル コード:

- (void)viewDidLoad
{
    [super setContentFilter:FILTER_POPULAR];  //Set the filter for the type of content
    [super viewDidLoad];
// Do any additional setup after loading the view.
}

2 つの説明:

  1. ストーリーボードやコントローラーで新しいビューを作成することなく、できるだけ多くのコードを再利用しようとしていることを付け加えておきます。

  2. 返されるメディアは非常に動的で、定期的に更新できるため、viewDidAppear で (getMedia を使用して) データをリロードする必要がありました。これは、特定のページを選択するたびに、新しいビューが読み込まれるときにちらつきが発生することを意味します...

更新 - さらに調査した結果、これは uicollectionview のサブクラス化とは関係ないようです。代わりに、問題はデータを uicollectionview にリロードすることです。確かに、2 つのサブクラス化されたビューの 1 つをクリックしただけです。また、問題がさらに悪化することを確認するために、viewdidAppear メソッドに reload メソッドを追加しました。また、コレクション ビューの最後の画像セットが、新しい画像が更新される前に、最初に画像の最後のカテゴリを表示するという問題があることも簡単に確認できます。コレクションが更新されると、ちらつきが発生します。

* 10 月 4 日更新 * 私の最善の解決策は、待機インジケーターを表示し、読み込み中にページをブロックすることだと考え始めています。私は uicollectionview を nil に設定しようとしましたが、それで問題も解決すると信じていますが、簡単にリセットできるかどうかはわかりません。

4

1 に答える 1

3

上記のコードではすぐにはわからないかもしれませんが、根本的な原因は実際には getMedia 呼び出しでした。サブクラス化などはすべて完全に正常に機能します。

具体的には、getMedia 呼び出しに reload メソッドがあり、問題を引き起こしていました。

[_mediaCollection performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
于 2013-10-04T17:03:09.457 に答える