0

1つのImageViewをフェードイン/フェードアウトしようとしている7つの画像があります。すべての画像を配列に保存し、各画像を表示して次の画像にフェードインするループがありますが、プログラムを実行すると、最後の2つの画像のみが表示されます。これがなぜであるかについてのアイデアはありますか?そしてそれを修正する方法は?コードは以下のとおりです。

imageArray = [NSArray arrayWithObjects:
              [UIImage imageNamed:@"image 0.jpg"],
              [UIImage imageNamed:@"image 1.jpg"],
              [UIImage imageNamed:@"image 2.jpg"],
              [UIImage imageNamed:@"image 3.jpg"],
              [UIImage imageNamed:@"image 4.jpg"],
              [UIImage imageNamed:@"image 5.jpg"],
              [UIImage imageNamed:@"image 6.jpg"],
              nil];
            self.imageview.backgroundColor = [UIColor blackColor];
              self.imageview.clipsToBounds = YES;

int count = [imageArray count];
for (int i = 0; i <count-1 ; i++)
{
    UIImage *currentImage = [imageArray objectAtIndex: i];
    UIImage *nextImage = [imageArray objectAtIndex: i +1];
    self.imageview.image = [imageArray objectAtIndex: i];
    [self.view addSubview:self.imageview];
    CABasicAnimation *crossFade = [CABasicAnimation animationWithKeyPath:@"contents"];
    crossFade.duration = 5.0;
    crossFade.fromValue = (__bridge id)(currentImage.CGImage);
    crossFade.toValue = (__bridge id)(nextImage.CGImage);
    [self.imageview.layer addAnimation:crossFade forKey:@"animateContents"];
    self.imageview.image = nextImage;

};
4

1 に答える 1

1

注意すべき点:

1)各遷移の間に遅延がないループですべてを同期的に実行しています。次のループで、最後の2まで、次のループに置き換えられるかどうかをアニメーション化しても意味がありません。また、追加します。imageView毎回サブビューとして、また不要です。

2)の.imageプロパティをimageView変更してから、レイヤーの内容を変更します。UIViewを使用しても、同じ効果が得られる可能性があります。

私の推奨事項は、ある画像から次の画像にスワップするメソッドを作成し、NSTimerそれらすべてを通過するまでx秒ごとに関数を呼び出すことです。

編集:将来のために:

self.imageview.backgroundColor = [UIColor blackColor];
self.imageview.clipsToBounds = YES;

完全に不要です:)

は、表示しているあなた.backgroundColorによって描画されUIImageます。

これ.clipsToBoundsはデフォルトの動作ですUIImageView(画像をそのサイズに縮小/拡大しますが、外側に描画することはありません)

于 2012-11-23T17:34:32.873 に答える