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

ach*_*ral 3 outline uilabel ios

我已经使用以下代码对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;
}
Run Code Online (Sandbox Code Playgroud)

Con*_*ltz 5

@MobileOverlord所说的当然是适用的,特别是关于分析的部分.

我会注意到设置shouldRasterize = YES并不是一个全能的解决方案(如果是这种情况,Apple为什么不将它设置为默认值?).是的,它可以提高滚动性能,但它可以牺牲内存使用量来实现,因为你可以在缓存中找到一堆大图像.

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

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

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