2012-10-03 64 views
0

我用GradientLayer自定義UIButton。我看到一個性能問題,因爲視圖加載速度很慢,看起來像一個衝擊效應。同樣改變方向時也是如此。我爲iPad應用程序使用此代碼。與正常的UIButton平滑加載/旋轉。用漸變圖層慢的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]; 
} 

是性能問題,由於梯度層?請告訴我如何糾正這個問題。

回答

0

嘗試在代碼中逐個註釋不同的屬性分配,並查看您是否獲得任何性能優勢。當我關閉時,我在一個應用程序中製作了一個應用程序,該應用程序在覈心動畫中獲得12FPS左右的動畫時,我在該圖層上使用了setCornerRadius,而接近完整的幀速率。這個問題可能是你的漸變,但是,除非你只是做一些關閉/打開各種屬性的a/b比較,否則你肯定不會知道。

雖然我現在告訴你,當我在表格視圖單元格中的按鈕上使用漸變圖層時,我能夠顯着加快表格滾動速度,當我只是使用按鈕的背景圖像時的梯度層。您可以嘗試打開shouldRasterize,但是,請確保您在圖層樹的頂層而不是在任何子圖層上執行此操作(儘管在iOS6中可能已經修復了在所有圖層上設置該參數的問題。只是沒有測試過)。

+1

嗨馬特..添加shouldRasterize整個按鈕幫助我提高了速度,但按鈕上的文字是模糊的。它破壞了外觀。同樣用rasterizationScale屬性解決。以下幾行解決了這個問題。 self.layer.shouldRasterize = YES; self.layer.rasterizationScale = [UIScreen mainScreen] .scale; – Srivathsa