Search code examples
iosswiftuiviewcore-animation

UILabel is not appearing in delayed sequence as expected


I want to make my UILabels appear in a delayed sequence. Thus one after another. The code below works when I make them fade in using the alpha value but it doesn't do what I want it to do when I use the .hidden property of the UILabels.

The code makes my UILabels appear at all the same time instead of sum1TimeLabel first after 5 seconds, sum2TimeLabel second after 30 seconds and finally sum3TimeLabel third after 60 seconds. What am I doing wrong?

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    UIView.animateWithDuration(5.0, animations:  {
        self.sum1TimeLabel!.hidden = false;
    })

    UIView.animateWithDuration(30.0, animations: {
        self.sum2TimeLabel!.hidden = false;
    })

    UIView.animateWithDuration(60.0, animations: {
        self.sum3TimeLabel!.hidden = false;
    })
}

Solution

  • As explained by SO user @matt in this answer, you can simply create a delay function with Grand Central Dispatch instead of using animateWithDuration, as animateWithDuration is usually meant for animating things over a period of time, and since the value you are animating is a Bool, it can't animate it.

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
    
        delay(5.0) {
            self.sum1TimeLabel?.hidden = false
        }
    
        delay(30.0) {
            self.sum2TimeLabel?.hidden = false
        }
    
        delay(60.0) {
            self.sum3TimeLabel?.hidden = false
        }
    }
    
    func delay(delay:Double, closure:()->()) {
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(delay * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), closure)
    }