Ios 基本核心动画-运动图像
没有UIVIEW动画,我正在学习核心动画 运行此代码时,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 =
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)移动层位置吗?
?我在添加动画后调用类似于此的抚慰,但您在添加动画之前执行了。为什么这样做?它认为这样做代码更少。您也不必担心以后删除动画。