gpt4 book ai didi

swift - 了解同步 Animate 与持续时间的行为

转载 作者:行者123 更新时间:2023-11-30 12:38:18 25 4
gpt4 key购买 nike

我无法理解同时 (animateWithDuration:animations:completion:) 方法调用在两者对给定 View 的同一属性进行动画处理的情况下如何相互交互。

我创建了以下测试项目来说明我所看到的行为,这与我对文档的理解完全相反。这是:

//
// ViewController.swift
// AnimationTest
//
// Created by Jeremie Benhamron on 2017-03-03.
// Copyright © 2017 beenie.inc. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
// Create and add a colored square
let coloredSquare = UIView()

// set background color to blue
coloredSquare.backgroundColor = UIColor.blue

// set frame (position and size) of the square
coloredSquare.frame = CGRect(x: 0, y: 120, width: 50, height: 50)

// finally, add the square to the screen
self.view.addSubview(coloredSquare)
//First Animation
// animate square moving to the right
UIView.animate(withDuration: 4.0,delay: 0.0,options: [],animations: {
coloredSquare.frame.origin = CGPoint(x: 320-50, y: 120)
},completion:{print($0)})
UIView.commitAnimations()

//second animation
//animate square moving back to original position
UIView.animate(withDuration: 5.0,delay:0,options:[UIViewAnimationOptions.beginFromCurrentState] , animations: {
coloredSquare.frame.origin = CGPoint(x: 0, y: 120)
},completion:{print($0)})
UIView.commitAnimations()
}

}

以下youtube link显示当我运行该项目时模拟器中发生的情况。

控制台上还会打印以下内容:

真实正确

我希望看到:

假正确

在控制台中,因为根据我的理解,第二个动画应该中断第一个动画,这会导致其完成 block 在动画完成之前执行,导致其输入参数设置为 false。

其次,我希望蓝色方 block 根本不会移动,因为第二个动画应该立即中断第一个动画,然后才能移动蓝色方 block 。但相反,我认为我们看到两个动画同时发生一些奇怪的叠加(因为蓝色方 block 没有我只包含第一个动画那样远)。

此外,如果您将第二个动画的持续时间设置为等于第一个动画的持续时间(即 4.0),则蓝色方 block 根本不会移动,表明它们的叠加以某种方式抵消了。

同样奇怪的是,beginFromCurresntState 选项似乎对方 block 的行为没有影响。

有人可以解释一下为什么动画 1 没有被动画 2 打断吗?

最佳答案

此处不应使用对 UIView.commitAnimations() 的调用。

有两种定义动画 block 的替代方法。旧的使用 UIView.beginAnimations() 来启动 block ,然后使用 UIView.commitAnimations() 来完成它。不再推荐这样做。

当前的方法是仅使用UIView.animate(withDuration:animations:completion:) 从而动画以旧的方式自动提交。

然而,这并不是奇怪行为的原因,这种行为在 Xcode 9.1 和 Swift 4 中绝对可以重现......

看来选项 .beginFromCurrentState 没有被考虑在内。我认为打开和关闭没有什么区别。

并且,您将获得两个运动的数学加法,而不是第一个动画在第二个动画生效之前完成。事实上,第二个动画被解释为“向左移动”,当您将第二个持续时间设置为小于第一个持续时间的值时,这一点变得最明显;小方 block 冲出屏幕,然后又慢慢移回来。令人着迷!

关于swift - 了解同步 Animate 与持续时间的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42593073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com