繁体   English   中英

为什么在主线程上调用闭包时会忽略我的动画?

[英]Why is my animation ignored when invoking a closure on the main thread?

要从主视图中删除子视图(子视图“调暗”父视图,因此它被称为dimView)我使用动画; 它基本上将子视图移动到屏幕底部并最终移出屏幕:

let centerY = CGRectGetMidY(view.bounds)
    let animation: CABasicAnimation = CABasicAnimation(keyPath: "position")
    animation.removedOnCompletion = false
    animation.fillMode = kCAFillModeForwards
    animation.fromValue = NSValue(CGPoint: view.center)
    animation.toValue = NSValue(CGPoint: CGPoint(x: view.center.x, y: 4 * centerY))
    animation.duration = 0.2
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
    dimView.layer.addAnimation(animation, forKey: "DimRemovingAnimation")

然后通过事件驱动函数我调用这个动画:

 @IBAction func done(sender: AnyObject) {

    let dimView = view.viewWithTag(1)
    if let dimView = dimView {

        removingAnimation(dimView)
        Delay.delay(0.4){

            dimView.removeFromSuperview()
        }

    }
}

这是我的延迟课:

class Delay{



class func delay(delay: Double, block: () -> ()){


    let when = dispatch_time(DISPATCH_TIME_NOW, Int64(Int(delay) * Int(NSEC_PER_SEC)))

    dispatch_after(when, dispatch_get_main_queue(), block)
}

}

当我在主线程(这是一个串行线程,并且应该以串行方式执行任务)上运行此闭包时,我的动画被忽略,并且dimView立即从视图层次结构中删除。 但是,当我在全局并发线程上运行闭包时,动画不会被忽略,代码会成功删除层次结构的dimView。 但这是非法的,因为您必须从主线程访问UIKit。

你能解释一下在主线程上调用闭包时问题是什么吗? 和我的问题的可能解决方案?

谢谢

问题是你将delay 0.4转换为Int ,即0 我建议更换引用

Int64(Int(delay) * Int(NSEC_PER_SEC))

Int64(delay * Double(NSEC_PER_SEC))

然而,作为进一步的改进,不是在经过一定时间后触发删除,而是让动画告诉它什么时候完成。 最简单,你可以使用块基础UIView动画:

UIView.animateWithDuration(0.2, delay: 0.0, options: .CurveEaseIn, animations: { 
    dimView.center = CGPoint(x: self.view.center.x, y: 4 * centerY)
}, completion: { finished in
    dimView.removeFromSuperview()
})

或者,如果必须使用CABasicAnimation ,请指定其delegate ,然后实现animationDidStop委托方法以删除视图:

override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
    dimView.removeFromSuperview()
}

顺便说一句,以上所有假设您没有为dimView指定自动布局约束。 如果您有,而不是通过更改与frame相关的属性进行动画处理,则应修改这些约束,然后将调用设置为layoutIfNeeded()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM