1

次のようなオーバーレイグラデーションを追加するUITableViewCellサブクラスがあります。

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {

        // add a layer that overlays the cell adding a subtle gradient effect
        _gradientLayer = [CAGradientLayer layer];
        _gradientLayer.frame = self.bounds;
        _gradientLayer.colors = @[(id)[[UIColor colorWithWhite:1.0f alpha:0.2f] CGColor],
                                  (id)[[UIColor colorWithWhite:1.0f alpha:0.1f] CGColor],
                                  (id)[[UIColor clearColor] CGColor],
                                  (id)[[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor]];
        _gradientLayer.locations = @[@0.00f, @0.01f, @0.95f, @1.00f];
        [self.layer insertSublayer:_gradientLayer atIndex:0];
    }
    return self;
}
-(void) layoutSubviews {
    [super layoutSubviews];
    // ensure the gradient layers occupies the full bounds
    _gradientLayer.frame = self.contentView.frame;
}

問題は、グラデーションがアクセサリビューが占めるスペースをカバーしていないことです。 ここに画像の説明を入力してください

また、左上隅にも曲がっていないことがわかります。

勾配を取得してセルスペース全体を占めるにはどうすればよいですか?

編集 - - -

以下に提案するように、私は追加しました:

+(Class)layerClass
{
    return [CAGradientLayer class];
}

セルのinitメソッドを次のように変更しました。

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        _gradientLayer = (CAGradientLayer*)self.layer;
        _gradientLayer.colors = @[(id)[[UIColor colorWithWhite:1.0f alpha:0.2f] CGColor],
                                  (id)[[UIColor colorWithWhite:1.0f alpha:0.1f] CGColor],
                                  (id)[[UIColor clearColor] CGColor],
                                  (id)[[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor]];
        _gradientLayer.locations = @[@0.00f, @0.01f, @0.95f, @1.00f];
    }
    return self;
}

ただし、グラデーションは次のように表示されます。 ここに画像の説明を入力してください

編集2---------以下のTarksの提案では、UIViewでグラデーションを使用し、セルの背景に割り当てると、この結果が得られます。 ここに画像の説明を入力してください

4

4 に答える 4

2

別の方法でそれを行います。サブクラスで+layerClassメソッドをオーバーライドします。

+(Class)layerClass
{
    return [CAGradientLayer class];
}

このように、セルの最上層はグラデーションレイヤーになります。次に、にキャストself.layerしてCAGradientLayer、その色と場所を設定します。

于 2012-12-15T08:57:41.393 に答える
1

これはあなたの場合の解決策として働くかもしれません:

アセット/動的に作成されたグラデーションを使用-画像とセル[UIColor colorWithPatternImage:gradientImage]のプロパティの設定に使用します。backgroundColor

レイヤーソリューションを使用する場合は、gradientlayerにマスクを設定する必要がありますが、マスクの形状はセクション内のセルの位置などによって異なります...

グラデーションで透明度/アルファを使用することは避けてください。少なくとも、例では必要ありません。

于 2012-12-15T11:43:25.370 に答える
0

backgroundViewこれを機能させる唯一の方法は、セルのプロパティを使用することだと思います。そうしないと、セルの境界線とアクセサリの表示に常に問題が発生します。グラデーションレイヤーをUIViewでラップし、これを背景ビューとして設定するだけです。あなたが怠惰になりたいのなら、誰かがすでにこれをしている:

https://github.com/ole/OBGradientView

selectedBackgroundViewグラデーションとして使用する場合も、プロパティを設定する必要があります。

于 2012-12-15T14:42:31.787 に答える
0

アクセサリビューと編集ビューはコンテンツビューの外に追加されます。コンテンツビューが常にセルに表示されるとは限りません。

レイヤーのフレームをself.contentView.frameではなくself.boundsに設定します。

于 2012-12-15T08:59:23.590 に答える