Как связать масштаб CAConstraint? - PullRequest
1 голос
/ 19 ноября 2010

Я хочу связать масштаб CAConstraint, чтобы ширина CALayer относительно его суперслоя могла указывать прогресс (QTMovie) на основе переменной, которую я обновляю в запланированном таймере. метод, который срабатывает каждую секунду. Ширина CALayer должна составлять 0,0f, если прогресс равен нулю, и 100% ширины суперслоя, когда прогресс завершен (т.е. currentProgress == 1.0f). Я создал слой с ограничением следующим образом:

self.progressLayer = [[[CALayer alloc] init] autorelease];

progressLayer.name = @"progressLayer";
progressLayer.backgroundColor = [Utilities blackColour];

[progressLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"superlayer" attribute:kCAConstraintMinX]];
[progressLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintHeight relativeTo:@"superlayer" attribute:kCAConstraintHeight]];
[progressLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY relativeTo:@"superlayer" attribute:kCAConstraintMidY]];
CAConstraint* constraint = [CAConstraint constraintWithAttribute:kCAConstraintWidth relativeTo:@"superlayer" attribute:kCAConstraintWidth scale:0.0f offset:0.0f];
[constraint bind:@"scale" toObject:[MediaPlayer sharedMediaPlayer] withKeyPath:@"currentProgress" options:nil];
[progressLayer addConstraint:constraint];

Проблема, с которой я столкнулся, заключается в том, что когда я обновляю переменную currentProgress в моем методе, который запускается каждую секунду, CALayer вообще не обновляет его ширину. Чтобы начать тестировать мой код, я просто увеличиваю значение прогресса на 0.01f, записываю сумму, и она определенно обновляется. Однако, когда я обновляю сумму на основе нажатия кнопки, слой обновляется правильно.

Просто для примера, я обновляю переменную в моем методе NSTimer в моем классе MediaPlayer:

- (void) checkProgress:(NSTimer*)timer {
    self.currentProgress += 0.01f;
    NSLog(@"checkProgress: %f", currentProgress);
}

И при нажатии кнопки я обновляю его так:

self.currentProgress += 0.1f;

Почему ширина слоя не обновляется в зависимости от изменений в моем методе, а обновляется при нажатии кнопки? У кого-нибудь есть какие-нибудь идеи для меня, чтобы попытаться понять это?

Спасибо!

1 Ответ

1 голос
/ 23 ноября 2010

Оказывается, что с моим нажатием кнопки я модифицировал слой «брат / сестра» (еще один слой, добавленный в его суперслой), который, похоже, побудил слой обновить его сам.Не изменяя другой слой, мой слой, который я ограничивал, просто не обновлялся.Таким образом, кажется, что ограничение переменной CAConstraint не будет обновлять CALayer.Может быть, это потому, что CAConstraint не имеет установщика для масштаба.И если бы у него был сеттер, он мог бы сказать слою, что его нужно обновить.Так что я решил установить ширину моего слоя другим способом.

...