2012-05-23 2 views
2

Я рисую как прокручиваемую диаграмму с использованием пользовательского расширения CALayer с кучей CGContextAddCurveToPoint звонков в [ MyCustomCALayer drawInContext].Привидение в [CALayer drawInContext]

На самом деле я не рисую всю длину графика, я перерисовываю содержимое слоя каждый раз при обновлении UIPanGestureRecognizer, чтобы отразить новое горизонтальное смещение. Таким образом, я рисую только видимую часть графика, а границы слоя распространяются только на размер экрана.

[ MyCustomCALayer setNeedsDisplay ] вызывается при изменении данных графика или изменении панорамы панорамирования, что приводит к вызову [ MyCustomCALayer drawInContext].

Однако, я получаю это странное ореолы всякий раз, когда я перерисовываю свой слой во время панорамирования. Немного о поиске предполагает, что это может быть implicit animation, вызванный перерисованием содержимого слоя, но я не могу найти окончательный ответ.

Вот что граф выглядит как в состоянии покоя: At rest

А вот во время панорамирования, с Ghosting перерисовкой: During panning

Конечно, когда я делать рисовать весь график и настроить свойство position слоя для панорамирования не является ореолом, но наличие большого длинного растрового изображения в памяти кажется Bad Thing.

Кто-нибудь видел этот вид ореолов раньше? Если это (как я подозреваю) неявная анимация, как я могу отключить указанную анимацию?

ответ

7

Возможно, это будет неявная анимация. Перерисовывание (изменения содержимого) анимируется, как и все остальное в Core Animation.

Есть несколько способов, чтобы предотвратить это, если вы подклассы CALayer сделать рисунок, что лучшим для переопределения - [CALayer actionForKey:], возвращая ноль для изменения в содержании:

- (id<CAAction>)actionForKey:(NSString *)key 
{ 
    if ([key isEqualToString: @"contents"]) 
    { 
     return nil; 
    } 

    return [super actionForKey: key]; 
} 
+0

Brilliant, спасибо @joerick, хороший ответ и сделал трюк красиво. –

+0

Следует отметить: actionForKey: также можно использовать для включения неявной анимации для пользовательских свойств вашего подкласса CALayer. Интересный материал! Спасибо за ответ, именно то, что я искал. – Form

2

Другой метод инвалидизирующего неявных анимационный:

[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 

Если отключение неявных анимации не делает этого, то вы могли бы рассмотреть возможность использование вида прокрутки и рисование всего эта в большом взгляде, который затем содержание этого свитка Посмотреть.

EDIT:

Я забыл упомянуть, что этот метод требует, чтобы вы делаете ваши изменения в блоке CATransaction

Смежные вопросы