iOS - iPhone 4S上的慢动画(但在模拟器上很好)

时间:2012-02-07 00:19:23

标签: ios uilabel outline

我已经使用以下代码对UILabel进行了子类化,这可以正常工作 - 但涉及子类的任何动画运行速度都比普通UILabels慢很多。我认为Quartz是罪魁祸首,但是我能做些什么来加快速度?

- (void)drawTextInRect:(CGRect)rect
{
    CGSize shadowOffset = self.shadowOffset;
    UIColor *textColor = self.textColor;

    // Establish the Quartz 2D drawing destination:
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 1);
    CGContextSetLineJoin(context, kCGLineJoinRound);

    // Draw the label’s outline:
    CGContextSetTextDrawingMode(context, kCGTextStroke);
    self.textColor = [UIColor whiteColor];
    [super drawTextInRect:rect];

    // Draw the label:
    CGContextSetTextDrawingMode(context, kCGTextFill);
    self.textColor = [UIColor textColor];
    self.shadowOffset = CGSizeMake(0, 0);
    [super drawTextInRect:rect];

    self.shadowOffset = shadowOffset;
}

2 个答案:

答案 0 :(得分:5)

@MobileOverlord所说的肯定是适用的,特别是有关分析的部分。

我会注意到设置shouldRasterize = YES并不是一个全能的解决方案(如果是这样的话,Apple为什么不将其设置为默认值?)。是的,它可以提高滚动性能,但它可以以内存使用为代价,因为你可以在缓存中找到一堆大图像。

它在创建时也会产生开销,我相信(但必须检查以确定)包括屏幕外渲染过程以实际创建光栅化副本。根据图层的使用方式,这实际上可能会影响性能。

要考虑的另一个因素是您的观点是否具有透明度。如果您可以向框架保证您的视图不透明(参见setOpaque / isOpaque),他们可以通过不考虑与Alpha通道相关的所有复杂性来优化渲染。类似的注意事项适用于CALayer。

最后,在您展示的代码块之外,您是否对底层进行了偷偷摸摸的事情(例如设置阴影或角半径)?这也是一种快速杀死动画效果的方法。

答案 1 :(得分:3)

完成标签绘制后,您可以在其图层上调用shouldRasterize,这样可以加快动画速度。

  

shouldRasterize一个布尔值,指示是否渲染图层   在合成之前作为位图。动画

     

@property BOOL shouldRasterize Discussion当这个值   property为YES,图层在其本地呈现为位图   协调空间,然后与任何其他人合成到目的地   内容。阴影效果和过滤器属性中的任何过滤器都是   栅格化并包含在位图中。但是,目前的不透明度   该图层未进行栅格化。如果光栅化的位图需要缩放   在合成期间,minificationFilter中的过滤器和   magnificationFilter属性根据需要应用。

     

当此属性的值为NO时,将合成图层   尽可能直接进入目的地。该层可能仍然   如果某些特征在合成之前被光栅化   合成模型(例如包含过滤器)需要它。

     

此属性的默认值为NO。

来自CALayer Class Reference

模拟器总能为您提供比设备更好的结果,因为它能够使用系统的全部处理能力和内存。你通常会以这种方式获得有缺陷的结果。每当你将CoreGraphics绘图与CoreAnimation结合使用时,在真实设备上测试结果非常重要。

为此,您可以尝试在Instruments Core Animation Tool中运行您的应用程序以尝试查找罪魁祸首。查看我的教程。

Instruments – Optimizing Core Animation