UIImageViewを使用したアニメーションがあります
myAnimatedView.animationImages = myImages;
myAnimatedView.animationDuration = 1;
myAnimatedView.animationRepeatCount = 1;
[myAnimatedView startAnimating];
アニメーションに、一連の画像の最後のフレームで停止するか、最後のフレームを表示するように指示するにはどうすればよいですか?
前もって感謝します
uIImageViewクラスのimageプロパティには、次のドキュメントがあります。「animationImagesプロパティにnil以外の値が含まれている場合、このプロパティの内容は使用されません。」
したがって、iOS4でアニメーションの最後のフレームを保持する秘訣は、最初にimageプロパティをその最後のフレームに設定し(animationImagesがまだnilの場合)、次にanimationImagesプロパティを設定してstartAnimatingを呼び出すことです。アニメーションが完了すると、imageプロパティが表示されます。コールバック/デリゲートは必要ありません。
最後のフレームの画像を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];
アニメーションが終了したら、UIImageView画像をアニメーションの最後のフレームに設定できます。
myAnimatedView.image = [myAnimatedImages objectAtIndex:myAnimatedImages.count - 1]
AnimationFinishイベントで通知するデリゲートメソッドはないと思います。そのため、通知を受け取るには、アニメーションと同じ期間でNSTimer
を開始する必要があります。
これは、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
}
}
アニメーション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を増やします。
Swiftバージョンは以下のようになりますが、Objective-Cロジックでは同じになりますimage
のUIImageView
を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()