Swift:UIView.transitionWithView完成块问题

时间:2015-06-04 21:42:03

标签: ios swift animation uiview

我尝试让我的UIImageView(self.posterImageview)使用以下代码循环播放一组带有动画的UIImages:

 func animatePoster (imageArray: [UIImage], count: Int = 0)
{
            UIView.transitionWithView
            (
                self.posterImageview,
                duration: 2,
                options: UIViewAnimationOptions.TransitionFlipFromBottom,
                animations:
                {
                    self.posterImageview.image = imageArray[count]
                },
                completion: 
                {
                    finished in
                    if (count == imageArray.count - 1)  // Last image
                    {
                        self.animatePoster(imageArray)
                    }
                    else
                    {
                    self.animatePoster(imageArray, count: count + 1)
                    }
                }
            )

}

然而,似乎完成块不起作用,我想象它应该如何。现在,它在所有图像中反复闪烁,而不允许播放完整的动画,然后再转到下一个。增加动画的持续时间没有帮助,当我对递归设置限制时(例如,当我到达最终图像时结束),然后所有图像都会快速循环,除了最后一个正确动画的动画。

任何见解都表示赞赏。

4 个答案:

答案 0 :(得分:0)

我对show cEmp dAmnt iAdv ----------- ------------- ----------- ----------- 1001 300.000 100.000 1 1001 200.000 50.000 2 1001 150.000 200.000 3 1001 0.000 50.000 3 1001 0.000 60.000 4 1002 1000.000 200.000 1 1002 800.000 500.000 2 1002 300.000 100.000 3 1002 200.000 100.000 4 做了一些不同的更改。请检查可能对您有所帮助。

现在我添加了假animation

code

答案 1 :(得分:0)

看起来你的观点有些困难。

为了便于理解,请将此代码放在游乐场中。 要放置图片,只需拖放内部。

import UIKit
import XCPlayground

let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 320, height: 240))
XCPlaygroundPage.currentPage.liveView = imageView // show layer in Playground timeline, don't forget to open right panel

func animate(images: [UIImage], index: Int = 0) {
    UIView.transitionWithView(imageView, duration: 2, options: .TransitionFlipFromBottom, animations: {
        imageView.image = images[index]
    }, completion: { value in
        let idx = index == images.count-1 ? 0 : index+1
        animate(images, index: idx)
    })
}

animate([UIImage(imageLiteral: "1.png"), UIImage(imageLiteral: "2.png"), UIImage(imageLiteral: "3.png")])

答案 2 :(得分:0)

主帖上的评论会引发有趣的地方。我建议您检查完成的参数,如chrisco所示。如果已完成NO,则完成处理程序在完成之前被调用的最可能原因是因为动画被取消 - 通常是因为另一个已被启动。是否有可能在第一个动画以某种方式完成之前触发第二个动画?我在您当前的代码中看不到,但是......我们无法看到您代码中的其他元素。

答案 3 :(得分:0)

从@ dimpiax的回答中创建了扩展

以下是代码:

extension UIImageView {

    func animate(images: [UIImage], index: Int = 0, completionHandler: (() -> Void)?) {

        UIView.transition(with: self, duration: 0.5, options: .transitionCrossDissolve, animations: {
            self.image = images[index]

        }, completion: { value in
            let idx = index == images.count-1 ? 0 : index+1

            if idx == 0 {
                completionHandler!()

            } else {
                self.animate(images: images, index: idx, completionHandler: completionHandler)
            }

        })
    }

}