Как мне скрыть прямоугольник за заданный интервал времени в Cocoa?

#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 достаточно (см. Выше).