如何在20秒后使用swift做动画? animateWithDuration:延迟:没用

时间:2016-03-23 08:27:39

标签: ios swift animation

UIView.animateWithDuration(10, delay: 20, options: .TransitionNone, animations: {

    }) { (let finish) in
        print("finish")
    }

与显示的代码一样,我希望在20秒后打印“完成”,但我立即得到它。

顺便说一下,有多少种方法会使操作延迟?

3 个答案:

答案 0 :(得分:3)

第一种方法:NSTimer

func myDelayedFunction() {
    print("delayed")
}

func myMainFunction() {
    let timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: "myDelayedFunction", userInfo: nil, repeats: false)
    timer.fire()
}

第二种方法:performSelector

func myDelayedFunction() {
    print("delayed")
}

func myMainFunction() {
    performSelector("myDelayedFunction", withObject: self, afterDelay: 10)
}

第三种方法:GCD(如果您需要匿名函数,则非常有用) (改编自this answer

let delayInSeconds: Int64 = 3
let popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * Int64(NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue()) {
    print("Delayed") 
}

第四种方法:sleep

func myMainFunction() {
    sleep(10) //This will block whichever thread you're running on.
    print("delayed")
}

我倾向于使用第一种方法,因为如果需要,我总是可以使计时器无效(调用timer.invalidate)。但是,每种方法都有其用例。

答案 1 :(得分:1)

如果你真的不需要做任何动画,可以使用GCD来完成这个

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(20 * NSEC_PER_SEC)), dispatch_get_main_queue()){
     print("finish")
};

你可以按照in this answer描述的那样制作一个整洁的小助手功能

答案 2 :(得分:1)

我认为,这是一种误解。在您的代码中:

UIView.animateWithDuration(10, delay: 20, options: .TransitionNone, animations: {
    // define animations
    self.myView.alpha = 0  // as an example
    }) { (let finish) in
        print("finish")
    }

动画完成后,将调用完成处理程序。它在delay秒(20.0)之后开始并且花费duration秒(10.0)。也就是说,动画应该在方法调用测量30秒后完成。

(您可以在代码中放置NSLog语句以查看事情何时发生)

我无法重现你正在经历的事情,那就是"完成"将立即打印。但是,我可以确认UIView.animateWithDuration按预期工作 - 假设动画块实际上不是空的。