Как создать подкласс CALayer и использовать пользовательское свойство?

Я пытаюсь создать подкласс 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 с пользовательским свойством. Любая помощь и объяснения будут оценены!

15
задан Guillaume 1 May 2012 в 06:58
поделиться