子层上的CAlayer变换用手势闪烁(ipad)

时间:2011-09-29 18:28:35

标签: ipad calayer catransform3d catransaction catextlayer

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

当用户在ipad上执行常规手势但我似乎无法正常工作时,我想在该图层上应用一些转换。使用CALayer的目的是仅将转换应用于该层,以便使用相同的转换同时影响我的所有子textLayer。

正在发生的变化似乎是在前一个位置和当前位置之间闪烁。我并没有真正得到可能存在的问题......例如,当我做一个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);

1 个答案:

答案 0 :(得分:6)

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

当您在任何图层上进行转换或操作时,CoreAnimation看起来像是使用默认动画。非常建议当你进行这样的CALayer操作时,你要经历他们所谓的“交易”。

我在CoreAnimation Programming guide下的transactions部分下找到了所有相关内容。

我的解决方案是实现这样的事务,并在执行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];
} 
     

}