91

アプリの下部にポップアップするこの小さな詳細ビューの下部に CAGradientLayer を挿入しました。ご覧のとおり、色を白から透明に設定しましたが、この奇妙な灰色の色合いが現れています。何か案は?

    // Set up detail view frame and gradient
    [self.detailView setFrame:CGRectMake(0, 568, 320, 55)];

    CAGradientLayer *layer = [CAGradientLayer layer];
    layer.frame = self.detailView.bounds;
    layer.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor, (id)[UIColor clearColor].CGColor, nil];
    layer.startPoint = CGPointMake(1.0f, 0.7f);
    layer.endPoint = CGPointMake(1.0f, 0.0f);
    [self.detailView.layer insertSublayer:layer atIndex:0];

問題のあるビューは次のとおりです。

ここに問題のあるビューがあります

4

7 に答える 7

62

Swiftでこれは私にとってはうまくいきました、

UIColor.white.withAlphaComponent(0).cgColor
于 2015-11-29T10:23:11.217 に答える
21

他の色はこのように機能することを指摘する価値があります...上記の2つの回答の組み合わせを使用して....

オブジェクティブ C

UIColor *colour = [UIColor redColor];
NSArray *colourArray = @[(id)[colour colorWithAlphaComponent:0.0f].CGColor,(id)colour.CGColor]
NSArray *locations = @[@0.2,@0.8];

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.colors = colourArray;
gradientLayer.locations = locations;
gradientLayer.frame = self.frame;

[self.layer addSublayer:gradientLayer];

スイフト3

let colour:UIColor = .red
let colours:[CGColor] = [colour.withAlphaComponent(0.0).cgColor,colour.cgColor]
let locations:[NSNumber] = [0.2,0.8]

let gradientLayer = CAGradientLayer()
gradientLayer.colors = colours
gradientLayer.locations = locations
gradientLayer.frame = frame

layer.addSublayer(gradientLayer)
于 2016-05-09T10:36:58.217 に答える
2

上記の回答は次のとおりです。

UIColor.white.withAlphaComponent(0).cgColor

UIColor(white: 1.0, alpha: 0.0).cgColor

OPが参照しているグレーではなく、グラデーションの一部をクリアにするという点で機能するはずです。ただし、透明な色が表示されているはずなのに、まだ透明な白がbackgroundColor表示されている場合は、グラデーションを適用するビューも同様に透明であることを確認してください。

デフォルトでは、そのビューの背景色は白 (デバイスがダーク モードの場合は暗い色) である可能性が高いため、グラデーションを適用すると、その透明な部分がビューbackgroundColor自体によって「ブロック」されます。それをクリアに設定すると、準備完了です。

于 2019-11-07T21:56:00.067 に答える
1

多くの場合、クリアホワイトを使用しているにもかかわらず、まだグレーの色が得られます.

そこで、アプローチを変更し、グラデーションではなくマスクを使用しました。これは、適切な背景を持っている場合だけでなく、すべての状況で機能するため、最終結果は同じです。

このコードを IB で試したことはありませんが、同様に機能することを願っています。設定するだけbackgroundColorで準備完了です。

@IBDesignable
class FadingView: UIView {

    @IBInspectable var startLocation: Double =   0.05 { didSet { updateLocations() }}
    @IBInspectable var endLocation:   Double =   0.95 { didSet { updateLocations() }}
    @IBInspectable var horizontalMode:  Bool =  false { didSet { updatePoints() }}
    @IBInspectable var diagonalMode:    Bool =  false { didSet { updatePoints() }}
    @IBInspectable var invertMode:      Bool =  false { didSet { updateColors() }}

    private let gradientLayerMask = CAGradientLayer()

    private func updatePoints() {
        if horizontalMode {
            gradientLayerMask.startPoint = diagonalMode ? CGPoint(x: 1, y: 0) : CGPoint(x: 0, y: 0.5)
            gradientLayerMask.endPoint   = diagonalMode ? CGPoint(x: 0, y: 1) : CGPoint(x: 1, y: 0.5)
        } else {
            gradientLayerMask.startPoint = diagonalMode ? CGPoint(x: 0, y: 0) : CGPoint(x: 0.5, y: 0)
            gradientLayerMask.endPoint   = diagonalMode ? CGPoint(x: 1, y: 1) : CGPoint(x: 0.5, y: 1)
        }
    }

    private func updateLocations() {
        gradientLayerMask.locations = [startLocation as NSNumber, endLocation as NSNumber]
    }

    private func updateSize() {
        gradientLayerMask.frame = bounds
    }

    private func updateColors() {
        gradientLayerMask.colors = invertMode ? [UIColor.white.cgColor, UIColor.clear.cgColor] : [UIColor.clear.cgColor, UIColor.white.cgColor]
    }

    private func commonInit() {
        layer.mask = gradientLayerMask
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        updatePoints()
        updateLocations()
        updateSize()
        updateColors()
    }
}
于 2018-12-18T18:11:56.690 に答える