UILabel 没有按预期出现在延迟序列中

UILabel is not appearing in delayed sequence as expected

我想让我的 UILabel 以延迟的顺序出现。就这样一个接一个。 当我使用 alpha 值使它们淡入淡出时,下面的代码可以工作,但是当我使用 UILabel 的 .hidden 属性 时,它不会执行我希望它执行的操作。

该代码使我的 UILabel 同时出现,而不是 5 秒后第一个出现 sum1TimeLabel,30 秒后出现第二个 sum2TimeLabel,最后 60 秒后出现第三个 sum3TimeLabel。我究竟做错了什么?

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;
    })
}
// Try this

override func viewDidAppear(animated: Bool) {
   super.viewDidAppear(animated)
   self.sum1TimeLabel!.hidden = true;
   self.sum2TimeLabel!.hidden = true;
   self.sum3TimeLabel!.hidden = true;

   UIView.animateWithDuration(5.0, animations: {

   }, completion: {
       self.sum1TimeLabel!.hidden = false;
   })

   UIView.animateWithDuration(30.0, animations: {

   }, completion: {
       self.sum2TimeLabel!.hidden = false;
   })

   UIView.animateWithDuration(60.0, animations: {

   }, completion: {
       self.sum3TimeLabel!.hidden = false;
   })
}

正如 SO 用户 @matt in this 回答所解释的,您可以简单地使用 Grand Central Dispatch 创建一个 delay 函数,而不是使用 animateWithDuration,因为 animateWithDuration 通常意味着用于在一段时间内对事物进行动画处理,并且由于您进行动画处理的值是 Bool,因此无法对其进行动画处理。

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)
}
class ViewController: UIViewController {

    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var label2: UILabel!
    @IBOutlet weak var label3: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        label1.alpha = 0
        label2.alpha = 0
        label3.alpha = 0
        UIView.animateWithDuration(5.0, animations: { () -> Void in
            print("animation on label1")
            self.label1.alpha = 0.2
            }) { (b) -> Void in
                print("complete on label1")
                self.label1.alpha = 1
                UIView.animateWithDuration(5.0, animations: { () -> Void in
                    print("animation on label2")
                    self.label2.alpha = 0.2
                    }, completion: { (b) -> Void in
                        print("complete on label2")
                        self.label2.alpha = 1
                        UIView.animateWithDuration(5.0, animations: { () -> Void in
                            print("animation on label3")
                            self.label3.alpha = 0.2
                            }, completion: { (b) -> Void in
                                print("complete on label3")
                                self.label3.alpha = 1
                        })
                })
        }
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

您无法为隐藏 属性 设置动画。只有两个状态。如何随时间不断改变隐藏?相反,您可以为 alpha 设置动画 :-)。尝试将动画块内的 alpha 值更改为 0 或 1。