带有渐变层的 UIButton 慢

Posted

技术标签:

【中文标题】带有渐变层的 UIButton 慢【英文标题】:UIButton with a gradient layer slow 【发布时间】:2012-10-03 14:20:21 【问题描述】:

我正在使用 GradientLayer 自定义 UIButton。我看到一个性能问题,因为视图加载缓慢并且看起来像一个混蛋效果。改变方向时也一样。我将此代码用于 iPad 应用程序。使用普通 UIButton 可以平滑加载/旋转。

我正在使用在谷歌(GradientButton 类)中找到的示例代码并且工作正常。容器 UIViewController 被推送到导航控制器堆栈以显示屏幕。

代码如下:

- (void)awakeFromNib 
    [self initLayers];



- (id)initWithFrame:(CGRect)frame 
    if (self = [super initWithFrame:frame]) 
        [self initLayers];
    
    return self;



- (void)initLayers 
    [self initBorder];
    [self addShineLayer];
    [self addHighlightLayer];

    self.clipsToBounds = YES;



- (void)initBorder 
    CALayer *layer = self.layer;
    layer.cornerRadius = 8.0f;
    layer.masksToBounds = YES;
    layer.borderWidth = 1.0f;
    layer.borderColor = [UIColor colorWithWhite:0.5f alpha:0.2f].CGColor;



- (void)addShineLayer 
    shineLayer = [CAGradientLayer layer];
    shineLayer.frame = self.layer.bounds;
    shineLayer.colors = [NSArray arrayWithObjects:
                         (id)[UIColor colorWithWhite:1.0f alpha:0.4f].CGColor,
                         (id)[UIColor colorWithWhite:1.0f alpha:0.2f].CGColor,
                         (id)[UIColor colorWithWhite:0.75f alpha:0.2f].CGColor,
                         (id)[UIColor colorWithWhite:0.4f alpha:0.2f].CGColor,
                         (id)[UIColor colorWithWhite:1.0f alpha:0.4f].CGColor,
                         nil];
    shineLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:0.5f],
                            [NSNumber numberWithFloat:0.5f],
                            [NSNumber numberWithFloat:0.8f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];
//    shineLayer.shouldRasterize = YES;
//    shineLayer.rasterizationScale = [UIScreen mainScreen].scale;
    [self.layer addSublayer:shineLayer];




#pragma mark -
#pragma mark Highlight button while touched


- (void)addHighlightLayer 
    highlightLayer = [CALayer layer];
    highlightLayer.backgroundColor = [UIColor colorWithRed:0.25f green:0.25f blue:0.25f alpha:0.75].CGColor;
    highlightLayer.frame = self.layer.bounds;
    highlightLayer.hidden = YES;
    [self.layer insertSublayer:highlightLayer below:shineLayer];



- (void)setHighlighted:(BOOL)highlight 
    highlightLayer.hidden = !highlight;
    [super setHighlighted:highlight];

性能问题是由于渐变层造成的吗?请告诉我如何纠正这个问题。

【问题讨论】:

【参考方案1】:

尝试一次注释掉代码中的不同属性分配,看看是否能获得任何性能优势。当我在图层上使用 setCornerRadius 时,我曾经开发过一个核心动画大约 12FPS 的应用程序,而当我关闭它时,它几乎是全帧速率。问题可能是您的渐变,但是,除非您只是进行一些 a/b 比较关闭/打开各种属性,否则您将无法确定。

不过,我现在要告诉你,当我在表格视图单元格中的按钮上使用渐变层时,当我只为按钮使用背景图像而不是一个渐变层。您可以尝试打开 shouldRasterize,但是,请确保您在图层树的顶层而不是在任何子图层上执行此操作(尽管我在所有图层上设置该参数时看到的问题可能已在 ios6 中修复。我只是还没有测试过)。

【讨论】:

嗨,马特。将 shouldRasterize 添加到整个按钮帮助我提高了速度,但按钮上的文本变得模糊。它破坏了外观。 rasterizationScale 属性也解决了同样的问题。以下几行解决了这个问题。 self.layer.shouldRasterize = YES; self.layer.rasterizationScale = [UIScreen mainScreen].scale;

以上是关于带有渐变层的 UIButton 慢的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有渐变和突出显示的 UIButton?

UIButton 边框中的生涩渐变

以编程方式将渐变边框颜色应用于 UIButton

如何为 UIButton 设置自定义渐变背景?

自定义 UIButton 类 - 渐变离开按钮边框

渐变层未显示在 UIButton 上