UIButton的梯度层很慢

时间:2012-10-03 14:20:22

标签: ios ipad uibutton calayer cagradientlayer

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

我正在使用google(GradientButton类)中的示例代码,并且工作正常。容器UIViewController被推送到navigationcontroller堆栈以显示屏幕。

以下是代码:

- (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 个答案:

答案 0 :(得分:0)

尝试一次评估代码中的不同属性分配,看看您是否获得任何性能优势。当我在图层上使用setCornerRadius时,我在核心动画中获得了大约12FPS的应用程序,而当我关闭它时几乎全帧速率。问题可能是你的渐变,但是,你不会确定,除非你只是做一些a / b比较关闭/开启各种属性。

我现在告诉你,当我在表视图单元格中的按钮上使用渐变图层时,当我只使用按钮的背景图像代替时,我能够加快表格的滚动速度渐变层。您可以尝试启用shouldRasterize,但是,请确保您在图层树的顶层而不是任何子图层上执行此操作(尽管我在iOS6中修复了在所有图层上设置该参数时遇到的问题。我只是没有测试过。)