2015-08-17 3 views
1

Я пытаюсь сделать очень базовую анимацию для UIButton. Целью является поворот слоя на 180 градусов. Вот мой код анимации, который вызывается из beginTrackingWithTouch:CABasicAnimation duration & keep position position

private func rotateButton() { 
    let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z") 
    rotationAnimation.timingFunction = CAMediaTimingFunction(name: "easeIn") 
    rotationAnimation.toValue = M_PI 
    rotationAnimation.duration = CollapseButton.kCollapseButtonAnimationDuration 
    rotationAnimation.repeatCount = 1 
    rotationAnimation.cumulative = true 
    layer.addAnimation(rotationAnimation, forKey: "rotationAnimation") 
} 

Теперь я хотел бы добавить, рушится вид анимации при нажатии этой кнопки. В моей ВК:

__weak __typeof(self) weakSelf = self; 
[UIView animateWithDuration:CollapseButton.kCollapseButtonAnimationDuration animations:^{ 

    CGRect currentFrame = weakSelf.frame; 
    currentFrame.size.height = 20; 
    weakSelf.frame = currentFrame; 

}]; 

У меня 2 вопроса:

  1. После нажатия заканчивает свою анимацию она сбрасывает позицию слоя. Таким образом, если стрелка показывала верхнюю часть, она анимировалась, чтобы показать вниз и, наконец, сбрасывается вверх. Как сохранить ориентацию слоя?

  2. Как вы можете видеть, продолжительность анимации и функции синхронизации одинаковы. По этой причине я не могу понять, что UIView оживляет гораздо медленнее. Есть идеи?

ответ

3

Основная анимация странная. Анимация создает «уровень представления», который генерирует внешний вид изменения, которое вы анимируете, но фактически не меняет рассматриваемое свойство.

Для того, чтобы ваша анимация завершилась с объектом в конечном состоянии, вы должны установить оба параметра fromValue (в начальном параметре) и значение toValue, а затем установить свойство в его конечное значение после отправки анимации:

private func rotateButton() { 
    let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z") 
    rotationAnimation.timingFunction = CAMediaTimingFunction(name: "easeIn") 
    rotationAnimation.fromValue = 0.0 //<<--- NEW CODE 
    rotationAnimation.toValue = M_PI 
    rotationAnimation.duration = CollapseButton.kCollapseButtonAnimationDuration 
    rotationAnimation.repeatCount = 1 
    rotationAnimation.cumulative = true 
    layer.addAnimation(rotationAnimation, forKey: "rotationAnimation") 
    layer.transform = CATransformMakeRotation(M_PI) //<<--- NEW CODE 
} 

Вы также можете установить removeWhenFinished свойство анимации, чтобы верно, но есть и другие осложнения.

BTW, вы не должны пытаться манипулировать фреймом представления, который имеет преобразование без идентичности. Вместо этого установите масштаб в преобразовании вида.

Я не уверен, почему 2 анимации занимают разные промежутки времени. Я замечаю, что вы устанавливаете функцию синхронизации CAAnimation на easeIn, но оставляя функцию синхронизации UIView по умолчанию (простота, непринужденность). Это создаст анимацию, которая не будет выглядеть одинаково. Вероятно, вы должны настроить анимацию вида на использование времени easeIn. (Для этого вам понадобится более длинная форма animateWithDuration:delay:options:animations:completion:)