首页 > 解决方案 > 过于频繁地更新 UILabel 文本

问题描述

我需要在我的应用程序中显示设备的倾斜度。该算法非常简单,我使用CMMotionManager' 的姿态来计算倾斜度,并且我正在更新一个显示度数的标签,如下所示:

- (void)tiltUpdated:(float)tilt
{
    _degreesLabel.text = [NSString stringWithFormat:@"%.1f°", tilt];
}

我的问题是下一个 - CMMotionManager 每秒调用陀螺仪更新大约 10 次。每次我都在计算新的倾斜和调用tiltUpdated方法。当我这样做时,我的应用程序开始出现令人难以置信的滞后。我需要澄清几件事:

  1. 滞后的原因在于更新标签。我通过评论很容易地定义了它。所以这不是倾斜计算(这就是为什么我没有在这里提供代码)

  2. 应用程序还始终显示相机输出。我关闭了相机,情况有所好转,但应用程序仍然滞后。

有什么方法可以优化更新 UILabel 文本?提前致谢!

标签: iosobjective-cperformanceuser-interfaceuilabel

解决方案


好的,最后回答了我自己的问题,但我希望这对某人有用:)。

我没有找到任何关于 UILabel 性能的有价值和详细的信息(这太糟糕了,因为我有兴趣了解这方面的知识),但我找到了一个替代方案,即CATextLayer.

我正在创建CATextLayer

_textLayer = [CATextLayer new];
_textLayer.frame = CGRectMake(0.0f, _degreesLabelView.frame.size.height*0.5f - textHeight*0.5f, _degreesLabelView.frame.size.width, textHeight); 
_textLayer.backgroundColor = [UIColor clearColor].CGColor;
_textLayer.foregroundColor = [UIColor whiteColor].CGColor;
_textLayer.alignmentMode = kCAAlignmentCenter;
_textLayer.contentsScale = UIScreen.mainScreen.scale;
_textLayer.fontSize = 17.0;
_textLayer.string = @"0°";
[_degreesLabelView.layer addSublayer:_textLayer];

在这里我正在更新文本:

- (void)tiltUpdated:(float)tilt
{
    _textLayer.string = [NSString stringWithFormat:@"%.1f°", tilt];
}

CATextLayer 也是一种带有轻微“淡入/淡出”的“动画”文本变化,我喜欢它 :)


推荐阅读