Преобразование CAlayer на подслои мерцает жестами (ipad) - PullRequest
1 голос
/ 29 сентября 2011

У меня есть CALayer, который содержит несколько других подслоев (на самом деле CATextLayer)

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

Что происходит, так это то, что трансформация, кажется, мерцает между предыдущей и текущей позицией. Я действительно не понимаю, в чем может быть проблема ... Когда я делаю жест панорамирования двумя пальцами, например, позиции CaTextLayer все время мерцают во время моего жеста, и в конце они все правильно помещаются в свою новую переведенную позицию.

Так что, кажется, все работает нормально, кроме той мерцающей вещи, которая меня сильно беспокоит.

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

Вот как я создаю свой CATextLayer (Это делается только один раз при создании и работает правильно):

_textString = [[NSString alloc] initWithString: text];   
_position = position;

attributedTextLayer_ = [[CATextLayer alloc] init];
attributedTextLayer_.bounds = frameSize;

//.. Set the font 

attributedTextLayer_.string = attrString;
attributedTextLayer_.wrapped = YES;

CFRange fitRange;
CGRect textDisplayRect = CGRectInset(attributedTextLayer_.bounds, 10.f, 10.f);
CGSize recommendedSize = [self suggestSizeAndFitRange:&fitRange 
                                      forAttributedString:attrString 
                                                usingSize:textDisplayRect.size];

[attributedTextLayer_ setValue:[NSValue valueWithCGSize:recommendedSize] forKeyPath:@"bounds.size"];
attributedTextLayer_.position = _position;

Вот как я добавляю их в свой Super CALayer

[_layerMgr addSublayer:t.attributedTextLayer_];

[[_drawDelegate UI_GetViewController].view.layer addSublayer:_layerMgr];

А вот как я применяю свое преобразование:

_layerMgr.transform = CATransform3DMakeAffineTransform (_transform);

1 Ответ

6 голосов
/ 30 сентября 2011

После большого количества чтения и тестирования ... Я нашел свое собственное решение.

Похоже, что CoreAnimation использует анимацию по умолчанию, когда вы выполняете преобразование или работу на любых слоях.Настоятельно рекомендуется, чтобы при выполнении такой операции CALayer вы проходили то, что они называют «Транзакциями».

Я узнал об этом в Руководстве по программированию CoreAnimation в разделе: транзакции .

Тогда я решил реализовать такую ​​транзакцию и предотвратить любую анимацию при выполнении операции CALayer.

Это то, что я делаю при применении моего преобразования (котороепредотвращает мерцание):

- (void) applyTransform

{

if (! CGAffineTransformIsIdentity (_transform))

{

    [CATransaction begin];

    //This is what prevents all animation during the transaction
    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];

    _layerMgr.transform = CATransform3DMakeAffineTransform(_transform);

    [CATransaction commit];
} 

}

...