NSTimer
и его настройка - большая работа для простой анимации. Вот мое решение, использующее диспетчеризацию, я просто увеличиваю и уменьшаю значение UIBarButtonItem
, изменяя альфа-значение цвета оттенка:
-(void)animateItemToTargetAlpha:(CGFloat)targetAlpha
{
static dispatch_source_t timer = nil;
static CGFloat DURATION = 0.25f;
static CGFloat FPS = 30.f;
dispatch_source_cancel(timer);
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1/FPS * NSEC_PER_SEC,(1ull * NSEC_PER_SEC) / 10);
CGFloat red, green, blue, __block alpha;
[self.navigationItem.rightBarButtonItem.tintColor getRed:&red green:&green blue:&blue alpha:&alpha];
dispatch_source_set_event_handler(timer, ^{
alpha = targetAlpha == 1.0f ? alpha + (1/(FPS * DURATION)) : alpha - (1/(FPS * DURATION));
self.navigationItem.rightBarButtonItem.tintColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
if(alpha >= 1 || alpha <= 0)
{
dispatch_source_cancel(timer);
}
});
dispatch_resume(timer);
}
Линейная кривая может быть немного заметна, но мне интересно сначала попробовать CADisplayLink, прежде чем вносить какие-либо изменения.