我已经使用以下代码对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;
}
答案 0 :(得分:5)
@MobileOverlord所说的肯定是适用的,特别是有关分析的部分。
我会注意到设置shouldRasterize = YES并不是一个全能的解决方案(如果是这样的话,Apple为什么不将其设置为默认值?)。是的,它可以提高滚动性能,但它可以以内存使用为代价,因为你可以在缓存中找到一堆大图像。
它在创建时也会产生开销,我相信(但必须检查以确定)包括屏幕外渲染过程以实际创建光栅化副本。根据图层的使用方式,这实际上可能会影响性能。
要考虑的另一个因素是您的观点是否具有透明度。如果您可以向框架保证您的视图不透明(参见setOpaque / isOpaque),他们可以通过不考虑与Alpha通道相关的所有复杂性来优化渲染。类似的注意事项适用于CALayer。
最后,在您展示的代码块之外,您是否对底层进行了偷偷摸摸的事情(例如设置阴影或角半径)?这也是一种快速杀死动画效果的方法。
答案 1 :(得分:3)
完成标签绘制后,您可以在其图层上调用shouldRasterize
,这样可以加快动画速度。
shouldRasterize一个布尔值,指示是否渲染图层 在合成之前作为位图。动画
@property BOOL shouldRasterize Discussion当这个值 property为YES,图层在其本地呈现为位图 协调空间,然后与任何其他人合成到目的地 内容。阴影效果和过滤器属性中的任何过滤器都是 栅格化并包含在位图中。但是,目前的不透明度 该图层未进行栅格化。如果光栅化的位图需要缩放 在合成期间,minificationFilter中的过滤器和 magnificationFilter属性根据需要应用。
当此属性的值为NO时,将合成图层 尽可能直接进入目的地。该层可能仍然 如果某些特征在合成之前被光栅化 合成模型(例如包含过滤器)需要它。
此属性的默认值为NO。
模拟器总能为您提供比设备更好的结果,因为它能够使用系统的全部处理能力和内存。你通常会以这种方式获得有缺陷的结果。每当你将CoreGraphics绘图与CoreAnimation结合使用时,在真实设备上测试结果非常重要。
为此,您可以尝试在Instruments Core Animation Tool中运行您的应用程序以尝试查找罪魁祸首。查看我的教程。