我有一个包含其他几个子层的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);
答案 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]; }
}