web-dev-qa-db-ja.com

最後のフレームでUIImageViewアニメーションを停止できますか?

UIImageViewを使用したアニメーションがあります

myAnimatedView.animationImages = myImages;
myAnimatedView.animationDuration = 1;
myAnimatedView.animationRepeatCount = 1;
[myAnimatedView startAnimating];

アニメーションに、一連の画像の最後のフレームで停止するか、最後のフレームを表示するように指示するにはどうすればよいですか?

前もって感謝します

32
Ivan

uIImageViewクラスのimageプロパティには、次のドキュメントがあります。「animationImagesプロパティにnil以外の値が含まれている場合、このプロパティの内容は使用されません。」

したがって、iOS4でアニメーションの最後のフレームを保持する秘訣は、最初にimageプロパティをその最後のフレームに設定し(animationImagesがまだnilの場合)、次にanimationImagesプロパティを設定してstartAnimatingを呼び出すことです。アニメーションが完了すると、imageプロパティが表示されます。コールバック/デリゲートは必要ありません。

73
Brian Bahner

最後のフレームの画像をUIImageViewインスタンスに設定すると、アニメーションが終了したときに最後のフレームの画像が表示されたままになります。コードは次のとおりです。

// create your array of images
NSArray *images = @[[UIImage imageNamed:@"video1.png"], [UIImage imageNamed:@"video2.png"]];
UIImageView *imageView = [UIImageView new];
imageView.image = images.lastObject;
imageView.animationImages = images;
imageView.animationDuration = 1.0; // seconds
imageView.animationRepeatCount = 1;
[imageView startAnimating];
15
Bogdan

アニメーションが終了したら、UIImageView画像をアニメーションの最後のフレームに設定できます。

myAnimatedView.image = [myAnimatedImages objectAtIndex:myAnimatedImages.count - 1]

AnimationFinishイベントで通知するデリゲートメソッドはないと思います。そのため、通知を受け取るには、アニメーションと同じ期間でNSTimerを開始する必要があります。

IImageViewAnimationドキュメント

6
texmex5

これは、UIImageViewのサブクラスを作成し、startAnimating()をオーバーライドし、super.startAnimating()を呼び出す前に、imageプロパティを画像配列の最後の画像に設定することで実現しました。これは、animationRepeatCountを1に設定することに加えて、目的の効果を実現します。

これが私のSwiftクラスです:

class SuccessAnimationImageView: UIImageView {

var duration: NSTimeInterval = 2

override func didMoveToSuperview() {
    super.didMoveToSuperview()
    setupImages()
}

override func startAnimating() {
    setLastFrame()
    super.startAnimating()
}

func setupImages() {
    animationImages = ImageHelper.successAnimationImages
    image = animationImages?.first
    animationRepeatCount = 1
}

func setLastFrame() {
    image = animationImages?.last
}
}
1
Harry Bloom

アニメーションUIViewの上に最初のフレームを保持しているUIViewを投げるだけです...アニメーションビューを非表示にして、その画像を最後のフレームとして設定します...そして、プロセス中に非表示のプロパティを切り替えます。

so... just before your last line...
// quickly hide the view that only holds the first frame
myOtherView.hidden = YES;
// start the animation
[myAnimatedView startAnimating];
// show the animation view
myAnimatedView.hidden = NO;
// BAM, done. It will use the last image when it ends.

可能な限り、コードを減らし、IBを増やします。

1

Swiftバージョンは以下のようになりますが、Objective-Cロジックでは同じになります
imageUIImageViewをimages配列の最後の画像に設定するだけでハッキングできます。 imageView.image = arrayOfImage.lastのようなアニメーションのコードの直前
ロジック全体を以下に示します

        imageView.image = arrayOfImage.last //(this line create magic)
        imageView.animationImages = arrayOfImage
        imageView.animationDuration = 1.0
        imageView.animationRepeatCount = 1
        imageView.startAnimating()
0
Ali Subhani