На самом деле уже нашли ответ на мой вопрос. Я создал делегат для моего объекта анимации NSViewAnimation и установил его, используя:
[animationObject setDelegate: delegateObject];
Затем в заголовочном файле для моего объекта delagateObject я настроил его на использование протокола "NSAnimationDelegate", набрав следующую строку:
@interface delegateObject : NSObject <NSAnimationDelegate> {
После этого я создаю метод
-(float)animation:(NSAnimation *)animation valueForProgress:(NSAnimationProgress)progress;
Это должна быть функция, которая описывает вашу собственную кривую анимации. Таким образом, он принимает прогресс анимации как значение от 0,0 до 1,0 и преобразует его в новое значение от 0,0 до 1,0 в соответствии с функцией, которую вы используете.
Я использовал в своем коде следующую функцию:
-(float)animation:(NSAnimation *)animation valueForProgress:(NSAnimationProgress)progress {
float value = -1/(20*(progress+0.047)) +1.045;
return value;
}
Это что-то вроде EaseOut, но оно работает должным образом, без необходимости менять начальный и конечный ключевые кадры и с гораздо более значительным различием скорости в начале и конце анимации.