2010-05-05 126 views
31

我使用一个UIImageView我可以在最后一帧停止UIImageView动画吗?

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

我怎么能告诉动画停在最后一帧或者是一系列图像的可见的最后一帧动画?

预先感谢您

回答

6

动画后完成您可以将您的UIImageView图像设置为动画的最后一帧。

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

我不认为这是一个委托方法,将通知您的animationFinish事件,这样你就需要开始一个NSTimer具有相同的持续时间动画得到通知。

UIImageViewAnimation documentation

+0

实际上,你可以忘记'NSTimer' - 只要你的图像动画,在'animationImages'将显示,直到动画结束,那么'图像'会显示。 – pix0r 2010-05-21 04:46:20

+0

这实际上不再适用于iOS4,FYI。试图找出解决方法,但我的应用程序正常工作3.看起来像animationImages现在清除图像属性。 – typeoneerror 2010-07-05 00:34:22

+0

同样在这里,我的应用程序突然有了iOS 4的bug。而且没有委托让我再次放回正确的图像。 – asandroq 2010-07-16 03:21:15

71

上UIImageView类图像属性有以下文件: “如果animationImages属性包含不是NIL的值,不使用此属性的内容。”

所以在iOS4中保留动画的最后一帧的技巧是首先将图像属性设置为最后一帧(而animationImages仍然为零),然后设置animationImages属性并调用startAnimating。当动画完成时,图像属性随即显示。不需要回拨/委托。

+26

我刚刚在iOS5上试用过它。我在'[myAnimatedView startAnimating]之前放了'animation.image = [myAnimatedView.animationImages lastObject];'并且动画停在最后一张图片上。 – mahboudz 2012-02-14 06:30:09

+1

这从文档没有意义;如果它做了它所说的话,那么分配图像将不会做任何事情。文档是错误的 - 图像属性*被使用,而图像不是动画。 – 2013-02-21 23:55:37

+0

只是为了澄清:mahboudz的解决方案即使使用透明部件的PNG或GIF也能正常工作。 “main”imageView.image仅在动画运行后生效,并且在动画期间不会“透过”透明部分(如果设置为此时)(iOS 5,6,7测试)。 – Janosch 2014-05-07 09:34:56

13

您可以将最后一帧的图像设置为您的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]; 
+0

如果所有图像都是png(透明),你会做什么,那么你可以看到背景图像 – Amitabha 2013-11-06 10:33:15

-1

是否已经设置旋转动画为NO, 例如, rota.removedOnCompletion = NO的removedOnCompletion属性;

这应该使表示层在动画完成时的位置。默认值为YES,可以恢复为模型值,即您描述的行为。 也应该设置fillMode,

即, rota.fillMode = kCAFillModeForwards;

1

我只是把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

您可以通过设置UIImageView的财产 animateImg.animationDuration = 1

1

我已经通过创建的UIImageView的子类,覆盖startAnimating(达到了这个),并设置图像属性停止动画成为最后的图像的图像阵列中在调用super.startAnimating()之前。 这除了将animationRepeatCount设置为1之外,还可以达到所需的效果。

这里是我的雨燕类:

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 
} 
} 
+0

是的,它在调用'startAnimating()'之前设置是很重要的。 *在调用'startAnimating()'后设置'self.image' *不起作用。 – 2017-09-21 06:38:00