Swift iOS具有相同UIView的多个连续多个动画?

舒尔盖

所以这就是我现在的位置。我仍然无法使它正常工作,并且尝试了很多变体。这是单个动画的原始代码。

导入UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        var images = [UIImage]()
        var images2 = [UIImage]()

        images += [#imageLiteral(resourceName: "circle1"), #imageLiteral(resourceName: "circle2"), #imageLiteral(resourceName: "circle3"), #imageLiteral(resourceName: "circle4")]
        images2 += [#imageLiteral(resourceName: "circle4"), #imageLiteral(resourceName: "circle3"), #imageLiteral(resourceName: "circle2"), #imageLiteral(resourceName: "circle1")]

        imageView.animationImages = images
        imageView.animationDuration = 4.0
        imageView.animationRepeatCount = 2
        imageView.startAnimating()
    }
}

我可以使用为时长和计数设置的属性来动画第一个图像数组。但是,我只是不明白如何编写此代码以添加第二组图像以在之后立即进行动画处理。我知道我需要以某种方式使用它:

UIView
    .animate(withDuration: 4.0,
             animations: {
                //animation 1
    },
             completion: { _ in
                UIView.animate(withDuration: 6.0,
                               animations: {
                                //animation 2
                })
    })

有人可以告诉我如何使用相同的imageView对象在给定当前图像数组的情况下编写这两个动画吗?我希望我的第一个动画(图像)的持续时间为4秒,而我的第二个动画(图像2)的持续时间为6秒,紧接在第一个动画之后。我无法确定我在animations参数中需要什么。

麦沙

我认为错误是您在这里混合了2件事:

  • UIView.animate ->动画控件和属性
  • UIImageView.startAnimating ->在UIImageView中启动图像循环

但是他们做的不一样,他们是非常独立的。但UIView动画通常用于其他用例。唯一的一件事就是它们的持续时间可能与UIImageView动画的持续时间相同,但是您没有设置UIImageView的持续时间。也许当您将图像视图的动画持续时间设置为UIView动画的持续时间时,它将在相同的时间范围内完成。

myImageView.animationDuration = 2;

第二个循环

myImageView.animationDuration = 4;

其他解决方案

问题是您需要知道何时完成图像循环。但这没有事件(我没有找到任何事件)

在StackOverflow上有一些解决方案:

1 performSelector afterDelay

将计时器设置为在持续时间结束后触发。为此,您还需要在图像视图中添加动画持续时间:

myImageView.animationDuration = 0.7;

来自这里的解决方案:如何快速完成imageView.startAnimating()?

按下按钮后,您可以延迟调用一个函数

self.performSelector("afterAnimation", withObject: nil, afterDelay: imageView1.animationDuration)

然后停止动画,并在afterAnimation函数中将imageArray的最后一个图像添加到imageView中。

func afterAnimation() {
    imageView1.stopAnimating()
    imageView1.image = imageArray.last
}

2个计时器

这类似于performSelector afterDelay但与NSTimer。

您可以在此处找到描述UIImageView startAnimating:如何使其停止在系列的最后一张图像上?

1)设置动画图像属性并启动动画(如问题中的代码所示)

2)安排NSTimer在“ animationDuration”秒时间内启动

3)当计时器关闭时,[...]

添加到点3:然后开始下一个动画

3 CATransaction

来自这里的解决方案:可可动画图像完成检测(您需要将其转换为swift 3语法,但这可能是一个起点

很老的问题,但是我现在需要修复,这对我有用:

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    DLog(@"Animation did finish.");
}];

UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.window.bounds];
imageView.animationDuration = 0.3 * 4.0;
imageView.animationImages = @[[UIImage AHZImageNamed:@"Default2"],
                              [UIImage AHZImageNamed:@"Default3"],
                              [UIImage AHZImageNamed:@"Default4"],
                              [UIImage AHZImageNamed:@"Default5"]];
imageView.animationRepeatCount = 1;
[self.window addSubview:imageView];

[imageView startAnimating];

[CATransaction commit];

4题外话:手动做图像动画

多数民众赞成在一点点,因为在这里他们手动做图像动画。对于您的用例,您只需更改从索引可见的图像的逻辑。向前计数直到最后一张图像,然后向后计数直到第一张图像。然后停止循环。不是很好的解决方案,但在此解决方案中添加了图像过渡动画:

来自这里的解决方案:在Swift中添加图像过渡动画

class ViewController: UIViewController {
        @IBOutlet weak var imageView: UIImageView!

        let images = [
                UIImage(named: "brooklyn-bridge.jpg")!,
                UIImage(named: "grand-central-terminal.jpg")!,
                UIImage(named: "new-york-city.jpg"),
                UIImage(named: "one-world-trade-center.jpg")!,
                UIImage(named: "rain.jpg")!,
                UIImage(named: "wall-street.jpg")!]
        var index = 0
        let animationDuration: NSTimeInterval = 0.25
        let switchingInterval: NSTimeInterval = 3

        override func viewDidLoad() {
                super.viewDidLoad()

                imageView.image = images[index++]
                animateImageView()
        }

        func animateImageView() {
                CATransaction.begin()

                CATransaction.setAnimationDuration(animationDuration)
                CATransaction.setCompletionBlock {
                        let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(self.switchingInterval * NSTimeInterval(NSEC_PER_SEC)))
                        dispatch_after(delay, dispatch_get_main_queue()) {
                                self.animateImageView()
                        }
                }

                let transition = CATransition()
                transition.type = kCATransitionFade
                /*
                transition.type = kCATransitionPush
                transition.subtype = kCATransitionFromRight
                */
                imageView.layer.addAnimation(transition, forKey: kCATransition)
                imageView.image = images[index]

                CATransaction.commit()

                index = index < images.count - 1 ? index + 1 : 0
        }
}

将其实现为自定义图像视图会更好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章