2016-03-03 2 views
2

НЕТ UIView АНИМАЦИЯ, я учусь Core AnimationBasic Core Animation - движущееся изображение

Когда я запускаю этот код, то 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 

} 

Любые мысли?

ответ

0

Вот что я придумал:

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) 
+0

Я принял этот ответ, потому что он самый простой здесь. Можете ли вы объяснить, почему вы должны сначала перенести положение слоев с помощью 'l.position = CGPointMake (CGRectGetMidX (self.view.bounds), -l.frame.height * 0.5)'? То, как я это делал, вызывало успокаивающее подобное после добавления анимации, но вы делали это, прежде чем добавлять анимацию. Почему это способ сделать это? – JEL

+0

Он думает, что это меньше кода. Вам также не нужно беспокоиться об удалении анимации позже. – nielsbot

0

, чтобы вы хотели, чтобы изображение было на экране в начале, а затем через 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) 
} 
+0

Если я сделаю это, анимация работает, но когда анимация заканчивается, изображение возвращается туда, где его начал. Изображение просто появляется там, где оно начиналось. Любые другие предложения? – JEL

+0

Хорошая точка - вы можете использовать группу анимаций (в этом случае всего две). Начните с «top' за кадром», принесите его на экран ОЧЕНЬ быстро, поэтому он не похож на анимацию и медленно удаляет ее , Вот описание группировки анимаций http://stackoverflow.com/questions/11737658/how-to-chain-different-caanimation-in-an-ios-application, и я обновлю ответ, чтобы показать, что я имею в виду – Russell

+0

Ok спасибо, глядя вперед к вашему обновленному ответу --- Я все еще очень новичок в основной анимации, так что мне сложно реализовать группы самостоятельно – JEL

Смежные вопросы