2009-02-04 5 views
0

Я использую CALayer для отображения пути через метод делегата drawLayer:inContext, который находится в контроллере представления, к которому принадлежит этот слой. Каждый раз, когда пользователь перемещает палец на экране, путь обновляется, и слой перерисовывается. Тем не менее, рисунок не справляется с прикосновением: всегда есть небольшое отставание в отображении последних двух точек пути. Он также мерцает, но только при отображении последних двух-трех очков снова. Если я просто рисую чертеж drawRect, он отлично работает, и рисунок определенно достаточно быстр.CALayer мерцает при рисовании пути

Кто-нибудь знает, почему он так себя ведет? Я подозреваю, что это связано с буферизацией слоя, но я не мог найти документацию об этом.

+0

OS X, не так ли? Возможно, вы используете неявные анимации свойств, которые по умолчанию включены в OS X. Вы можете попробовать: [[CATransaction begin]; [CATransaction setValue: @YES forKey: kCATransactionDisableActions]; ... привлечь ...; [CATransaction commit]; ' – nielsbot

ответ

0

Возможно, вам повезло с использованием layer hosting view.

Вместо использования в drawLayer: InContext: метод, настроить вид вы хотите, и добавить к нему CALayer:

UIView *layerHosting = [[UIView alloc] initWithFrame:frame]; 
[layerHosting setLayer:[[CALayer new] autorelease]]; 

Надежда, что помогает!

+1

Я никогда не видел' [UIView new] 'раньше (но он действительно существует в соответствии с документами Apple). Однако я рекомендую использовать '[[UIView alloc] initWithFrame: frame]' и '[CALayer layer]', потому что именно так они предназначены для использования. – MrMage

+0

Вы должны использовать '-initWithFrame:', чтобы быть безопасным, поскольку это назначенный инициализатор. Наверное, безвредно. (Вы можете просто передать 'CGRectZero'.) – nielsbot

+0

Кроме того, вы можете использовать' + [CALayer layer] '(который работает для ARC и не ARC) и' [[[CALayer new] autorelease] '... – nielsbot

1

[UIView new] является просто сокращенным для [[UIView alloc] init].

+0

не ответ ... должен быть комментарий. – nielsbot

1

Дайте следующее перед setNeedsDisplay метод ::

[CATransaction begin]; 

[CATransaction setValue:[NSNumber numberWithFloat:someDelay] forKey:kCATransactionAnimationDuration]; 

[aLayer setNeedsDisplay];      
[CATransaction commit]; 
Смежные вопросы