0

Я пытаюсь повернуть CALayer чуть меньше 360 градусов, но вместо этого преобразование поворачивает его в противоположном направлении (это меньше двух углов). Как я могу достичь этого вращения, учитывая, что я также применяю трансляцию трансляции на слое? Кроме того, я хочу иметь возможность контролировать направление вращения. Кажется, CAAnimation не будет прислушиваться и принять более короткий угол преобразования для вращения. Кажется, эти две проблемы, возможно, связаны между собой. Вот как выглядит часть моего быстрого кода:Вращающийся CALayer более чем на 180 градусов с использованием преобразования

func addAnimation() { 
    var animation : CABasicAnimation = CABasicAnimation(keyPath: "transform") 

    animation.delegate = self 

    let translateDistY = CGRectGetMidY(self.view.bounds) - CGRectGetMidY(self.displayLayer.bounds) 
    let rotationAngle = (CGFloat(M_PI*2.0) - 0.1) 

    var transform : CATransform3D = CATransform3DMakeTranslation(0, translateDistY, 0) 
    transform = CATransform3DRotate(transform, rotationAngle, 0, 0, 1) 

    animation.fromValue = NSValue(CATransform3D: CATransform3DIdentity) 
    animation.toValue = NSValue(CATransform3D: transform) 

    animation.duration = 1.3 
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 

    let animStruct = animationStruct(animLayer: self.displayLayer, animation: animation, layerTransform: transform) 

    self.animationSequence.append(animStruct) 
} 

func doAnimation() { 
    if animationSequence.count > 0 { 
     let animStruct = animationSequence.removeAtIndex(0) 
     animStruct.animLayer.transform = animStruct.layerTransform 
     animStruct.animLayer.addAnimation(animStruct.animation, forKey: nil) 
    } 
} 

override func animationDidStop(anim: CAAnimation!, finished flag: Bool) { 
    self.doAnimation() 
} 

ответ

0

Похоже, что нет возможности повернуть, но вам нравится использовать обычную анимацию трансляции. Один из способов сделать это - использовать пользовательские свойства слоя. Смотрите это замечательное сообщение от Ника Локвуда.

http://www.objc.io/issue-12/animating-custom-layer-properties.html

+0

Спасибо Вань за ответ ! Я перейду по ссылке, которую вы предоставили, это определенно будет иметь огромную помощь в моем понимании темы. Я придумал какое-то решение проблемы, которую я публикую ниже. – Carvak

0

У меня есть какое-то решение этой проблемы, но я не уверен, если это правильно, или если есть лучшее решение. Тем не менее, здесь следует быстрый код:

func addAnimation() { 
    let translateByValueY = CGRectGetMidY(self.view.bounds) - CGRectGetMidY(self.diaplayLayer.bounds) 

    var animRotateZ : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") 
    animRotateZ.duration = 1.5 
    animRotateZ.toValue = NSNumber(double: -0.2) 
    animRotateZ.byValue = NSNumber(double: 2.0 * M_PI) 
    animRotateZ.delegate = self 
    animRotateZ.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 
    animRotateZ.setValue(self.diaplayLayer, forKey: "animationLayer") 
    self.animationSequence.append(animRotateZ) 

    var animTranslateY : CABasicAnimation = CABasicAnimation(keyPath: "transform.translation.y") 

    animTranslateY.duration = 1.5 
    animTranslateY.toValue = NSNumber(double: Double(CGRectGetMidY(self.view.bounds))) 
    animTranslateY.byValue = NSNumber(double: Double(translateByValueY)) 
    animTranslateY.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 
    animTranslateY.setValue(self.diaplayLayer, forKey: "animationLayer") 
    self.animationSequence.append(animTranslateY) 

} 

func doAnimation() { 
    if animationSequence.count > 0 { 
     let animRotateZ = animationSequence.removeAtIndex(0) 
     let animationRotateZLayer = animRotateZ.valueForKey("animationLayer") as CALayer 

     animationRotateZLayer.setValue(animRotateZ.toValue, forKeyPath: "transform.rotation.z") 
     animationRotateZLayer.addAnimation(animRotateZ, forKey: animRotateZ.keyPath) 

     let animTranslateY = animationSequence.removeAtIndex(0) 
     let animationTranslateYLayer = animTranslateY.valueForKey("animationLayer") as CALayer 

     animationTranslateYLayer.setValue(animTranslateY.toValue, forKeyPath: "transform.translation.y") 
     animationTranslateYLayer.addAnimation(animTranslateY, forKey: animTranslateY.keyPath) 
    } 
} 

override func animationDidStop(anim: CAAnimation!, finished flag: Bool) { 
    self.doAnimation() 
} 

Я нарисовал много информации из следующих постов на StackOverflow, возможно, благодаря им:

Using CABasicAnimation to rotate a UIImageView more than once

How to chain different CAAnimation in an iOS application

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