Как настроить UIViewAnimationCurve как функцию CAMediaTimingFunctionWithControlPoints - PullRequest
5 голосов
/ 28 марта 2012

UIViewAnimationCurve имеет только

  • UIViewAnimationCurveEaseInOut
  • UIViewAnimationCurveEaseIn
  • UIViewAnimationCurveEaseOut
  • UIViewAnimationCurveLinear

эти функции.

но мне нужна ExpoOut , BackInOut анимация для UIView.

как ExpoOut [CAMediaTimingFunction functionWithControlPoints:0.12 :0.51 :-0.4 :1];

Я использовал CABasicAnimation , но он не может изменить frame , как анимация UIView, очень плохо при изменении размера представления.

или, у вас есть какой-нибудь лучший способ изменить рамку вида как реальную, а не как zoomin.

спасибо.

Ответы [ 3 ]

3 голосов
/ 17 января 2013

Проблема здесь в том, что невозможно указать функцию синхронизации для анимации на основе UIView.Насколько я могу судить, у вас останется множество неприятных опций:

  • Переключитесь на использование анимации на основе CALayer - с серьезной проблемой: если делегат установлен на представление, анимацияне бываетТак как это требуется для UIViews, это неинтересная опция.
  • Добавьте родительский слой к вашим представлениям и анимируйте этот слой - с такой же серьезной проблемой, что этот слой нигде не будет находиться в перо, и внесите изменения в пероможет непреднамеренно нарушить анимацию.
  • Не использовать пользовательскую функцию синхронизации.

Я взломал свой путь, установив делегат равным нулю перед анимацией, и вернув обратно в UIView.сразу после этого, но кажется очень грязным.Я могу что-то упустить, хотя.Мой код выглядит примерно так:

- (void)methodThatAnimates {
    [CATransaction begin]; {
        /* Must set to nil, otherwise the view just jumps to the new location. */
        self.viewToAnimate.layer.delegate = nil;

        CAMediaTimingFunction *timingFunction = 
            [CAMediaTimingFunction functionWithControlPoints:0.4 :0 :0 :1.0];
        [CATransaction setAnimationTimingFunction:timingFunction]
        self.viewToAnimate.layer.position = CGPoint(15.0, 0.0);

        /* Set delegate back to the view, as is required per the 
           Apple documentation. */
        self.viewToAnimate.layer.delegate = self.viewToAnimate;
    } [CATransaction commit];
}

Пока что, похоже, он работает как шарм, но я все еще ожидаю появления какого-то странного артефакта из-за временно нулевого делегата.

2 голосов
/ 04 мая 2013

Возможно, вы захотите взглянуть на MTAnimation .Это категория UIView, которая предоставляет jQuery как функции синхронизации.

0 голосов
/ 01 мая 2012

Существует только ограниченное количество параметров с функциями синхронизации мультимедиа. Вы можете использовать стандартные, которые вы перечислите, или предоставить пару контрольных точек для кубической кривой Безье. Однако сгенерированная вами кривая не может генерировать значение меньше 0 или больше 1, поскольку она используется для отображения линейного времени на время вывода.

Значения контрольной точки, которые вы перечисляете, не имеют смысла как значения времени. Если я не ошибаюсь, они приведут к замедлению времени и возврату к значению меньше 0.

Если вам нужна произвольная анимация, например, размером, вы можете использовать CAKeyFrameAnimation с рядом контрольных точек.

...