2012-02-07 107 views
3

我已经用下面的代码子类化了UILabel,它工作正常 - 但是任何涉及子类的动画运行速度比普通UILabels慢很多。我假设Quartz是罪魁祸首,但是我能做些什么来加快速度?iOS - 在iPhone 4S上缓慢动画(但在模拟器上很好)

- (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; 
} 

回答

5

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

我会注意到,设置shouldRasterize = YES并不是一个全面的解决方案(为什么Apple没有将它设置为默认值,如果是这种情况呢?)。是的,它可以提高滚动性能,但它可以以牺牲内存使用为代价,因为最终可能会在缓存中放置大量大图像。

它在创建时也会产生开销,我相信(但必须检查以确保)包括屏幕外渲染传递以实际创建栅格化副本。取决于图层的使用方式,这可能会影响性能。

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

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

+0

我同意康拉德。优秀的加法。 – MobileOverlord 2012-02-08 01:40:09

3

你完成绘制标签,你可以把它的层上shouldRasterize,并应加快动画后。

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

@property BOOL shouldRasterize讨论当此 属性的值是YES,该层在其本地 坐标空间渲染为位图,然后合成到目的地与任何其他 内容。阴影效果和滤镜属性中的任何滤镜都是 栅格化并包含在位图中。但是,该层的当前不透明度未被光栅化。如果栅格化位图在合成期间需要缩放 ,则会根据需要应用缩小过滤器和缩放过滤器属性中的过滤器。

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

此属性的默认值为NO。

CALayer Class Reference

模拟器总是要给你的方式更好的结果不是设备会因为它能够使用你的系统的全部处理能力和内存。这样你通常会得到有缺陷的结果。无论您何时将CoreGraphics与CoreAnimation一起绘制,在真实设备上测试结果都很重要。

为此,您可以尝试在乐器核心动画工具中运行您的应用程序以尝试查找肇事者。看看我的教程。

Instruments – Optimizing Core Animation

+0

这个答案帮助了我。我允许用户在运行时更改“UIImageView.Layer”的'MagnificationFilter'。它在模拟器中工作,但显示器不会在设备上更新。启用'ShouldRasterize'解决了我的问题。 – 2012-06-11 20:26:41

相关问题