Почему CALayer движется медленнее, чем UIView? - PullRequest
3 голосов
/ 13 октября 2011

У меня есть подкласс UIView, который перемещается вокруг событий, когда пользователь касается их, используя следующий переопределенный метод:

// In a custom UIView...

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint point = [[touches anyObject] locationInView:self];
    UIView *eventView = [self.ringOfEvents hitTest:point withEvent:event];
    for (EventView *e in self.events) {
        if (e == eventView) {
            event.position = point;
        }
    }
}

Почему, когда я делаю EventView CALayer вместо UIView,движение замедляется до ползучести?Я тоже могу опубликовать этот код, но он настолько похож, что я не думаю, что он необходим.

Я думаю, что абстрагирование до более низкого уровня ускорит обработку событий, но я должен что-то упустить.

Кстати, если *eventView является подклассом UIView или CALayer, свойство position выглядит следующим образом:

- (void)setPosition:(CGPoint)pos {
    self.layer.position = pos;
}

- (CGPoint)position {
    return self.layer.position;
}

Не знаю, почему я получаюогромное снижение задержки при использовании UIView по сравнению с CALayer ..

Ответы [ 2 ]

6 голосов
/ 13 октября 2011

Большинство свойств CALayer по умолчанию изменяются с анимацией, поэтому, вероятно, это связано с уменьшением задержки.

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

2 голосов
/ 19 декабря 2012

Это связано с неявной анимацией.

Я реализовал метод категории, который удаляет неявную анимацию для ключей givven и может использоваться следующим образом:

[view.layer setNullAsActionForKeys:@[@"bounds", @"position"]];

Реализация

@implementation CALayer (Extensions)

- (void)setNullAsActionForKeys:(NSArray *)keys
{
    NSMutableDictionary *dict = [self.actions mutableCopy];

    if(dict == nil)
    {
        dict = [NSMutableDictionary dictionaryWithCapacity:[keys count]];
    }

    for(NSString *key in keys)
    {
        [dict setObject:[NSNull null] forKey:key];
    }

    self.actions = dict;
}

@end
...