0

GradientLayer で UIButton をカスタマイズしています。ビューの読み込みが遅くなり、ジャーク効果のように見えるなど、パフォーマンスの問題が発生しています。向きを変えても同じです。このコードを iPad アプリケーションに使用しています。通常の UIButton を使用すると、スムーズなロード/回転が可能です。

Google で見つけたサンプル コード (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];
}

パフォーマンスの問題はグラデーションレイヤーによるものですか?? この問題を修正する方法を教えてください。

4

1 に答える 1

1

コード内のさまざまなプロパティの割り当てを一度に1つずつコメントアウトして、パフォーマンスが向上するかどうかを確認してください。レイヤーでsetCornerRadiusを使用した場合、コアアニメーションで約12FPSを取得していたアプリで作業しましたが、オフにした場合はほぼフルフレームレートでした。問題は勾配である可能性がありますが、さまざまなプロパティをオフ/オンにするいくつかのa / b比較を行わない限り、確実にはわかりません。

ただし、テーブルビューセルのボタンにグラデーションレイヤーを使用した場合、グラデーションレイヤーの代わりにボタンに背景画像を使用しただけで、テーブルのスクロールを大幅に高速化できました。 。shouldRasterizeをオンにすることはできますが、サブレイヤーではなく、レイヤーツリーのトップレベルでオンにするようにしてください(ただし、すべてのレイヤーでそのパラメーターを設定する際に見た問題は、iOS6で修正されている可能性があります。まだテストしていません)。

于 2012-10-05T05:06:31.103 に答える