簡體   English   中英

漸變層慢的UIButton

[英]UIButton with a gradient layer slow

我正在用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];
}

是性能問題歸因於漸變層嗎? 請告訴我如何解決此問題。

嘗試一次注釋掉代碼中的不同屬性分配,看看是否可以獲得任何性能上的好處。 我曾經在一個應用程序上工作過,當我在圖層上使用setCornerRadius時,其核心動畫的速度約為12FPS,而當我將其關閉時,幾乎達到了全幀速率。 問題可能出在您的漸變上,但是,除非您只是進行一些a / b比較來關閉/打開各種屬性,否則您將無法確定。

不過,我現在要告訴您,當我在表格視圖單元格中的按鈕上使用漸變層時,當我僅將背景圖像用作按鈕而不是漸變層時,就能夠極大地加快表格滾動。 您可以嘗試啟用shouldRasterize,但是,請確保在圖層樹的頂層而不是在任何子圖層上進行此操作(盡管我在所有圖層上設置該參數時看到的問題可能已在iOS6中修復。只是沒有測試過)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM