2010-05-05 133 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