Мне показалось, что я вспомнил про прохождение некоторых документов Apple, когда я изучал, как использовать Core Animation, в которой показано, как настраивать анимации, которые не могут быть обработаны описаниями Properticode, которые поставляются с определенными анимациями.По пути я наткнулся на некоторый пример кода от Apple, который описывается как:
Один слой градиента отображается и постоянно анимируется с использованием новых случайных цветов.
Это можетбыть ответом на конкретную задачу, которую вы уже выполнили другим способом.Я нашел это в Документации и Справочнике API в XCode, и имя примера кода просто Градиенты .(Обратите внимание, что существует оригинальная версия 1.0 и обновленная версия 1.1, которые были переделаны в этом году в апреле, и поэтому их будет проще использовать с текущими инструментами.
Но, более сложный вопрос создания пользовательской анимации, которая можетАвтоматизация с помощью Core Animation сама по себе следует примеру Apple 1011 * Руководство по программированию анимации для какао в разделе Использование объекта NSAnimation . Это описано в разделе Создание подклассов NSAnimation и рекомендуемый метод показан под заголовком Плавная анимация . Вы переопределяете метод setCurrentProgress:
так, что при каждом его вызове вы сначала вызываете Super
, так что NSAnimation обновляет значение прогресса , т. Е. Ваше пользовательское анимированное свойство, а затем выполняет любое обновление или рисование, необходимые для следующего кадра вашей анимации.пример кода, предоставленного Apple в указанной документации:
Как указано в разделе «Настройкаи Обработка меток прогресса ». Вы можете прикрепить серию меток прогресса к объекту NSAnimation и попросить делегата реализовать анимацию: didReachProgressMark: метод для перерисовки объекта на каждой метке прогресса.Однако это не лучший способ оживить объект.Если вы не установите большое количество меток прогресса (30 или более в секунду), анимация, вероятно, будет выглядеть прерывисто.
Лучшим подходом является создание подкласса NSAnimation и переопределение метода setCurrentProgress: метод, как показано в листинге4. Объект NSAnimation вызывает этот метод после каждого кадра, чтобы изменить значение прогресса.Перехватывая это сообщение, вы можете выполнить любое перерисовывание или обновление, необходимое для этого кадра.Если вы переопределите этот метод, обязательно вызовите реализацию super, чтобы он мог обновлять текущий прогресс.
Listing 4 Overriding the setCurrentProgress: method
- (void)setCurrentProgress:(NSAnimationProgress)progress
{
// Call super to update the progress value.
[super setCurrentProgress:progress];
// Update the window position.
NSRect theWinFrame = [[NSApp mainWindow] frame];
NSRect theScreenFrame = [[NSScreen mainScreen] visibleFrame];
theWinFrame.origin.x = progress *
(theScreenFrame.size.width - theWinFrame.size.width);
[[NSApp mainWindow] setFrame:theWinFrame display:YES animate:YES];
}
Таким образом, в основном вы определяете «значение прогресса» (возможно, состоящее из несколькихзначения), который определяет состояние вашей пользовательской анимации и пишет код, который с учетом текущего «значения прогресса» рисует или изменяет то, что рисуется, когда анимация находится в этом конкретном состоянии.Затем вы позволяете NSAnimation запускать анимацию, используя обычные методы настройки анимации, и он выполняет ваш код для рисования каждого кадра анимации в соответствующее время.
Я надеюсь, что это ответит на то, что вы хотели знать.Я сомневаюсь, что мог бы легко найти это, выполнив поиск, не увидев его раньше, так как мне, наконец, пришлось пойти туда, где, как я думал, это может быть, и пролистать страницу за страницей всю тему, чтобы найти ее снова!