无法在 Swift 中使用时间延迟为 UIImage 设置动画

Posted

技术标签:

【中文标题】无法在 Swift 中使用时间延迟为 UIImage 设置动画【英文标题】:Cannot animate UIImage with timing delay in Swift 【发布时间】:2018-02-13 13:43:55 【问题描述】:

我试图在 3 秒后为 UIImage 的 alpha 设置动画。默认情况下,alpha 设置为 0,3 秒后,alpha 应更改为 1,从而向用户显示图像。我为动画编写的代码确实将 alpha 设置为 0,但我无法在 3 秒后将 alpha 更改为 1。我是 swift 的新手,不知道我哪里出了问题。这是我的代码。

import UIKit

class WelcomeOneViewController: UIViewController 

@IBOutlet weak var swipeImageView: UIImageView!

override func viewDidLoad() 
    super.viewDidLoad()
    swipeImageView.alpha = 0


override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    displaySwipeView()


func displaySwipeView() 
    UIView.animate(withDuration: 1.0, delay: 3.0, options: .beginFromCurrentState, animations: 

        DispatchQueue.main.async  [weak self] in
            self?.swipeImageView.alpha = 1
        

    , completion: nil)



【问题讨论】:

如果你想让你的动画在 3 秒内完成,那么 withDuration: 1.0, 应该是 withDuration: 3.0, 我希望动画在 3 秒延迟后开始,而不是 3 秒完成。 你从哪里调用这个方法?确保它是视图将出现而不是视图加载并在主队列中尝试 我在 viewDidAppear 中调用该函数没有运气 【参考方案1】:

用这段代码试试吧:

import UIKit

class WelcomeOneViewController: UIViewController 

    @IBOutlet weak var swipeImageView: UIImageView!

    override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)
        swipeImageView.alpha = 0
    

    override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)
        displaySwipeView()
    

    func displaySwipeView() 
        swipeImageView.alpha = 0
        UIView.animate(withDuration: 1.0, delay: 3.0, options: [], animations: 
            self.swipeImageView.alpha = 1
        , completion: nil)
    


【讨论】:

那没有成功。视图加载后,图像仍然立即可见。 @AndrewTuzson 现在怎么样? 成功了!但是,现在图像在消失之前可以看到一瞬间。我该如何克服呢? 我会在 viewWillAppear 中使用 swipeImageView.alpha = 0 吗? @AndrewTuzson 这意味着在viewDidLoadviewDidAppear 之间的某个位置,您再次将swipeImageView.alpha 设置为1.. 尝试将swipeImageView.alpha = 0 设置为viewWillAppear()【参考方案2】:

尝试在主队列中这样做:

func displaySwipeView() 
  UIView.animate(withDuration: 1.0, delay: 3.0, options: .beginFromCurrentState, animations: 

   DispatchQueue.main.async  [weak self] in
    self?.swipeImageView.alpha = 1
   

  , completion: nil)

希望对你有帮助!

【讨论】:

谢谢!在将 alpha 设置为 0 后,我复制了您的语法并在 viewDidLoad() 中调用了 displaySwipeView()。当屏幕加载时,图像现在可见。有什么想法吗? 所以现在的问题是,如果我是对的,那张图片会加载但没有动画? 没错。加载视图时立即显示图像。我已经更新了原帖中的语法。 放在主线程上没用.. viewDidLoad 已经在主线程上执行了 @AndrewTuzson 尝试使用任何其他 UIViewAnimationOptions。除了 .beginFromCurrentState 之外,请尝试使用 .curveEaseInOutbeginFromCurrentState 有时会出现意外行为。

以上是关于无法在 Swift 中使用时间延迟为 UIImage 设置动画的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 中使用延迟调用数组项 - 获取 UIResponder 错误

扩展中的延迟加载属性(Swift)

延迟不到一秒,Swift 2

AVAudioPlayer 在 Swift 4.2 中产生延迟

在 Swift 中对声音进行延迟排序

在 Playground 中的 swift 3 中添加延迟似乎不准确