iOS: добавлен слой (обновление на CADisplayLink) для просмотра триггеров [view layoutSubviews] 60x / sec. Почему? - PullRequest
0 голосов
/ 25 июля 2011

Я не могу понять это.

У меня есть вид.

это спидометр.

Я положил иглу в спидометр:

- (id) initWithFrame: (CGRect) frame
{    
    self = [super initWithFrame: frame]; // [super initWithCoder: coder];
    if (! self)
        return nil;

    :
    :
    : 
    self.needle = [ [ [Needle alloc] initWithMaxRadius: 0.5*300

    [self.layer addSublayer: needle.layer];

    self.needle.layer.position = CGPointMake( frame.size.width / 2, frame.size.height / 2 );

    return self;
}

Объект иглы содержит свойство CALayer.

стрелка заботится о позиционировании для каждого кадра - она ​​устанавливает свой собственный обработчик связи дисплея и выполняет преобразование на этом слое

теперь внезапно метод layoutSubviews моего представления попадает в каждый кадр.

Я не могу понять это поведение.

Я могу понять некоторые изменения в SUPERview, из-за которых этот метод получил удар. но как SUBlayer может заставить это?

неужели подслой должен быть во власти своего родителя?

Я пытался установить

self.autoresizesSubviews = NO;

что явно не имеет эффекта

свойство, которое я ищу, будет

self.getsAutoresizedBySubviewsOrLayers = NO;

что происходит?

1 Ответ

1 голос
/ 03 октября 2011

Добавление подпредставления вызовет layoutSubviews для подпредставления, его цели и всех подпредставлений цели.

Более подробную информацию вы можете найти здесь в вопросе Когда вызывается layoutSubviews?

Кстати, у вас могут быть некоторые утечки памяти в коде выше.

Если needle является сохраняемым свойством, эта строка вызовет чрезмерное сохранение:

self.needle = [ [ [Needle alloc] initWithMaxRadius: 0.5*300

В общем, лучше никогда не ссылаться на "self." в методе init.

...