带有发布构建设置的 Swift 动画完成错误

Posted

技术标签:

【中文标题】带有发布构建设置的 Swift 动画完成错误【英文标题】:Swift animation completion bug with release build settings 【发布时间】:2015-01-30 12:52:09 【问题描述】:

有两种视图控制器,Initial 和 modal。我们在初始控制器中有动画,在模态控制器中也有动画。每个动画都有完成块。我们将构建方案 Run –> Build configuration 设置为 Release。运行应用程序,转到模态控制器并运行动画。在动画之后(在模态控制器中),初始控制器中的动画完成块被调用,而不是模态控制器中的完成块。有没有人也遇到过这种情况?有什么建议吗?

Sample project here (产品 -> 方案 -> 编辑方案 -> 运行 -> 构建配置:发布)

【问题讨论】:

【参考方案1】:

这绝对是一个优化错误。

我发现的一个快速解决方法是将 completions: 闭包转换为 @objc_block

视图控制器:

    UIView.animateWithDuration(0.3,
        delay: 0.0,
        options: UIViewAnimationOptions.CurveEaseInOut,
        animations:  () -> Void in
            self.rectangleView.alpha = 1.0
        ,
        completion:  (complete) -> Void in
            println("111 Hello ViewController 1")
         as @objc_block (Bool) -> Void
        //   ^^^^^^^^^^^^^^^^^^^^^^^^^^
    )

ViewController2:

    UIView.animateKeyframesWithDuration(duration,
        delay: 0.0,
        options: UIViewKeyframeAnimationOptions.CalculationModeLinear,
        animations:  () -> Void in
            UIView.addKeyframeWithRelativeStartTime( 0.0,
                relativeDuration: (duration / 2),
                animations:  () -> Void in
                    self.rectangleView.alpha = 0.1
                
            )
            UIView.addKeyframeWithRelativeStartTime(
                (duration / 2),
                relativeDuration: (duration / 2),
                animations:  () -> Void in
                    self.rectangleView.backgroundColor = UIColor.blueColor()
                
            )
        ,
        completion:  (complete) -> Void in
            println("Hello ViewController 2")
         as @objc_block (Bool) -> Void
        //   ^^^^^^^^^^^^^^^^^^^^^^^^^^
    )

【讨论】:

以上是关于带有发布构建设置的 Swift 动画完成错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 collectionView 的 Hero ViewController 动画 - swift

Swift - 显示带有动画的标题

在执行代码之前等待 Swift 动画完成

带有不安全构建标志的 Swift 包依赖项:目标完整性错误

swift UIView 动画完成处理程序首先调用

使用 UIDynamics Swift 为 UICollectionView 设置动画