0

ImageViews を含むセルを持つ UICollectionView があります。セルに表示したい画像をダウンロードした後、セル内に既にあるプレースホルダー画像で画像をクロスディゾルブしたいと思います。

すべてが期待どおりに機能しますが、CollectionViews を再利用し始めるとすぐに、奇妙なことがわかり始めます。

  • プレースホルダー画像 (アニメーションなしで行われる) の設定が無視されます。
  • そして、それがフェードアウトするよりも、コレクション/テーブルビューをリロードした後に(他のセルに)表示される最後の画像です。

私は現在、次のコードでそれをやっています:

weakSelf.image = placeholderImage;
[UIView transitionWithView:weakSelf
                  duration:5.0f
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                     weakSelf.image = image;
              } completion:nil];

でも、そんなことしてもどうにもならない…。

weakSelf.image = placeholderImage;
CATransition  *transition = [CATransition animation];
[transition setType:kCATransitionFade];
transition.duration = 5.0;
[weakSelf.layer addAnimation:transition
                      forKey:@"fade"];
weakSelf.image = image;

UIViews presentationLayer のキャッシングの問題ですか? UICollectionViewsまたはUITableViewsでフェードインするためにできることはありますか?

編集:

問題を示す小さなサンプル プロジェクトをアップロードしました... https://dl.dropboxusercontent.com/u/809469/ImageTransition.zip

Demo-App を実行し、右上のリロード ボタンを押すと、ランダムな他の画像から画像がフェードしていることがわかります。フェードはまた同じ画像の間にあると思います...そして、self.imageView.image = nil;どういうわけか無視されますか?!?!

4

1 に答える 1

0

このように使用[UIView animateWithDuration:]して、すべての複雑さを回避できます。

weakSelf.image = placeholderImage;
[UIView animateWithDuration:5.0f animations:^{
    weakSelf.alpha=0.0f;

} completion:^(BOOL finished) {
    weakSelf.image = image;
    [UIView animateWithDuration:5.0f animations:^{
        weakSelf.alpha=1.0f;

    }];
}];

セットすることweakSelf.alpha=1.0f;を忘れない でくださいweakSelf.image = placeholderImage;prepareForReuse:

于 2014-02-25T13:20:32.953 に答える