#macos #cocoa #animation #graphics
#macos #какао #Анимация #графика
Вопрос:
Я пишу приложение Cocoa для OS X, в котором пользователь может рисовать квадраты на NSView
экземпляре, щелкая мышью. В настоящее время я заставляю квадраты исчезать через 2 секунды, используя performSelector:withObject:afterDelay:
метод NSObject
, чтобы принудительно перерисовать представление без включения квадрата.
Однако вместо того, чтобы просто исчезать, я бы хотел, чтобы квадраты постепенно исчезали. Я пытался использовать an NSTimer
для периодического принудительного перерисовки, при этом непрозрачность квадрата уменьшалась до 0 в течение 2 секунд, но это кажется довольно неэлегантным и, вероятно, неэффективным, особенно если у меня много квадратов.
Есть ли идиоматический способ сделать это?
ОБНОВЛЕНИЕ: просто чтобы уточнить, я хочу, чтобы каждый квадрат, нарисованный в представлении, имел независимое исчезновение, начиная с точки, в которой он нарисован, я не собираюсь скрывать весь вид.
Комментарии:
1. Если вы рисуете с помощью NSBezierPath или NSRect, вы должны иметь возможность задать свойство цвета вашего пути или прямоугольника с помощью NSColor: yourObjectOneColor = [NSColor color:(float)0.0 green:(float)0.0 blue:(float)0.0 alpha: (float)1.0]; Поэтому попробуйте анимировать вальфа 0.0
Ответ №1:
Решение, которое я в конечном итоге использовал, заключается в создании CALayer
экземпляра для каждого квадрата, а не в использовании NSRectFill
для рисования квадратов. Затем непрозрачность каждого CALayer
экземпляра может быть независимо анимирована с помощью CABasicAnimation
экземпляра. Например.
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
[animation setFromValue:[NSNumber numberWithFloat:1.]];
[animation setToValue:[NSNumber numberWithFloat:0.]];
[animation setDuration:2.];
[layer setOpacity:0.];
[layer addAnimation:animation forKey:@"opacity"];
Ответ №2:
Вероятно, NSAnimationContext — это то, что вы ищете.
Комментарии:
1.
NSAnimationContext
выглядит удобно, но оказалось излишним для того, что мне было нужно.CABasicAnimation
достаточно (см. Выше).