2

我有一个包含很少其他子层的 CALayer(实际上是 CATextLayer)

当用户在 ipad 上做通常的手势时,我想在该层上应用一些转换,但它似乎不能正常工作。使用 CALayer 的目的是仅将转换应用于该层,以便我的所有子文本层将同时受到相同转换的影响。

正在发生的事情是转换似乎在先前位置和当前位置之间闪烁。我真的不明白可能是什么问题......例如,当我做一个 2 根手指平移手势时,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);

4

1 回答 1

6

经过大量阅读和测试......我找到了自己的解决方案。

当您对任何图层进行转换或操作时,CoreAnimation 似乎使用默认动画。非常建议您在执行此类 CALayer 操作时,通过他们所谓的“事务”。

我在CoreAnimation 编程指南中的“事务”部分下找到了所有相关信息。

然后我的解决方案是实现这样的事务,并在进行 CALayer 操作时防止任何动画。

这就是我在应用转换(防止闪烁)时所做的:

-(void)applyTransform

{

如果(!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];
} 

}

于 2011-09-30T16:16:03.733 回答