Ios 基本核心动画-运动图像

Ios 基本核心动画-运动图像,ios,swift,animation,core-animation,Ios,Swift,Animation,Core Animation,没有UIVIEW动画,我正在学习核心动画 运行此代码时,top图像不在屏幕上。4秒钟后,它重新出现并按预期运行。不知道为什么。我想要的是,当应用程序启动时,top图像出现在屏幕上,然后在4秒钟后,top图像向上移出屏幕 @IBOutlet var top: UIImageView! override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) let openTop =

没有UIVIEW动画,我正在学习核心动画

运行此代码时,
top
图像不在屏幕上。4秒钟后,它重新出现并按预期运行。不知道为什么。我想要的是,当应用程序启动时,
top
图像出现在屏幕上,然后在4秒钟后,
top
图像向上移出屏幕

    @IBOutlet var top: UIImageView!

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

    let openTop = CABasicAnimation(keyPath: "position.y")
    openTop.fromValue = self.top.frame.origin.y
    openTop.toValue = -self.view.bounds.size.height
    openTop.duration = 1.0
    openTop.beginTime = CACurrentMediaTime() + 4
    self.top.layer.addAnimation(openTop, forKey: nil)
    self.top.layer.position.y = -self.view.bounds.size.height

}

有什么想法吗?

那么您希望图像在开始时显示在屏幕上,然后在4秒钟后从顶部飞出?可以通过将动画分组在一起来实现这一点

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

    // keep a track of where we want it to be
    let y = self.top.layer.position.y

    // move it out of the way - this where it will end up after the animation
    self.top.layer.position.y = -self.view.bounds.size.height

    // do nothing, other than display the image for 4 seconds
    let doNothing = CABasicAnimation(keyPath: "position.y")
    doNothing.fromValue = y
    doNothing.toValue = y
    doNothing.duration = 4.0

    // zip it away
    let openTop = CABasicAnimation(keyPath: "position.y")
    openTop.fromValue = y
    openTop.toValue = -self.view.bounds.size.height
    openTop.duration = 1.0
    openTop.beginTime = doNothing.beginTime + doNothing.duration

    // create the group
    let group = CAAnimationGroup()
    group.duration = 5.01
    group.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
    group.removedOnCompletion = false
    group.fillMode = kCAFillModeForwards
    group.animations = [doNothing, openTop]

    self.top.layer.addAnimation(group, forKey: nil)
}

以下是我的想法:

let l = top.layer!
let startingPosition = l.position
l.position = CGPointMake( CGRectGetMidX( self.view.bounds ), -l.frame.height * 0.5 )

l.addAnimation({
    let anim = CABasicAnimation( keyPath: "position" )
    anim.fromValue = NSValue( CGPoint:startingPosition )
    anim.beginTime = CACurrentMediaTime() + 4.0
    anim.fillMode = kCAFillModeBoth
    return anim
}(), forKey: nil)

如果我这样做,动画会工作,但是当动画结束时,图像会回到它开始的位置。图像只是显示在它开始的地方。还有其他建议吗?很好-你可以使用一组动画(在本例中只有两个)从
top
屏幕外开始,非常快地将其显示在屏幕上,这样看起来就不像动画了,然后慢慢地将其删除。下面是对分组动画的描述,我会更新答案来说明我的意思好的,谢谢期待你的更新答案---我对核心动画还是很陌生,所以我很难自己实现分组,你只需将你的图像放在屏幕上方,然后添加一个动画,将其从屏幕上移动到办公室。根据@nielsbot的评论,我简化了上面的答案。我接受了这个答案,因为它在这里是最简单的。您能解释一下为什么必须先用
l.position=CGPointMake(CGRectGetMidX(self.view.bounds),-l.frame.height*0.5)移动层位置吗?
?我在添加动画后调用类似于此的抚慰,但您在添加动画之前执行了。为什么这样做?它认为这样做代码更少。您也不必担心以后删除动画。