Я пытаюсь создать подкласс CALayer
с пользовательским свойством index
, которое я могу как анимировать, так и изменять напрямую, чтобы отображать другое изображение на основе индекса.
В шапке я объявил:
@property NSUInteger index;
В реализации я переопределилneedDisplayForKey
:
+ (BOOL)needsDisplayForKey:(NSString *)key
{
if ([key isEqualToString:@"index"])
return YES;
else
return [super needsDisplayForKey:key];
}
Теперь в методе display
я хочу вывести картинку на основе индекса. Однако во время анимации значение self.index
никогда не меняется, поэтому мне приходится запрашивать значение уровня представления, в отличие от примера Предоставление содержимого CALayer путем создания подклассов :
- (void)display
{
NSUInteger presentationIndex = [(CustomLayer *)[self presentationLayer] index];
self.contents = (id)[[images objectAtIndex:presentationIndex] CGImage];
}
. Проблема в том, что если я делаю что я не могу установить значение index
непосредственно вне анимации, потому что это изменит только слой модели, а метод display
явно запрашивает уровень представления.
Если я добавлю метод инициализации, который копирует значение index
, он будет работать.:
- (id)initWithLayer:(id)layer
{
self = [super initWithLayer:layer];
if (self) {
if ([layer isKindOfClass:[CustomLayer class]])
self.index = [(CustomLayer *)layer index];
}
return self;
}
Однако после или перед анимацией всегда возникает сбой в 1 изображении, поскольку представление или значение модели не совпадают (в зависимости от того, установил ли я index
значение назначения или нет ).
drawInContext:
всегда правильное значение для [self index]
, но это не тот метод, который я хочу использовать, поскольку я просто установил свойство content
с изображением.index
. Если я использую @dynamic index
(, который работает, даже несмотря на то, что в документации не говорится, что настраиваемые методы получения/установки свойств будут динамически реализованы ), display
вызывается каждый раз, когда значение index
изменяется. Если я использую @synthesize
или реализую установщик, display
не вызывается, поэтому мне также нужно изменить content
в установщике.setValue:forKey:
?Как видите, я немного запутался в том, как получить желаемый результат и как правильно реализовать подкласс CALayer с пользовательским свойством. Любая помощь и объяснения будут оценены!