iOS White to trong suốt Gradient Layer có màu xám


87

Tôi đã chèn CAGradientLayer vào cuối chế độ xem chi tiết nhỏ này bật lên ở cuối ứng dụng. Như bạn có thể thấy, tôi đã đặt các màu từ trắng sang trong, nhưng có màu xám kỳ lạ này đang hiển thị. Có ý kiến ​​gì không?

    // 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];

Đây là chế độ xem có vấn đề:

Đây là cái nhìn có vấn đề


Dưới lớp là gì?
trojanfoe

MapView. Tôi có thể thiết lập layer để sử dụng clearColor và clearColor và nó sẽ hoàn toàn trong suốt.
Eric Gao

Những gì tôi đang cố gắng đạt được: lớp dưới lớp này có màu xám không?
trojanfoe

Không ... không nên insertSublayer ở chỉ số 0 đặt lớp này ở lớp sâu nhất? Và nếu tôi không chèn lớp con, nền của chế độ xem vẫn rõ ràng như bình thường. Chỉ khi tôi thiết lập gradient thì màu xám đó mới hiển thị.
Eric Gao

Thay vào đó, bạn đã thử đặt nó thành self.detailView.layer.mask chưa? (self.detailView.layer.mask = lớp;)
Akaino

Câu trả lời:


185

clearColor có kênh màu đen với alpha là 0, vì vậy tôi phải sử dụng

[UIColor colorWithWhite:1 alpha:0]

và nó hoạt động tốt.


16
Nó thay thế bóng đen bằng bóng trắng. Vẫn không minh bạch
RealNmae

2
Quan trọng - cho năm 2018, xem xét phương pháp này: stackoverflow.com/a/25408833/294884
Fattie

7
@RealNmae Nếu bạn muốn chuyển từ một màu sang trong, hãy sử dụng UIColor.startColor và UIColor.startColor.withAlphaComponent (0.0) làm hai màu của bạn.
Conor

@Conor Đây thực sự là câu trả lời chính xác - cảm ơn, hoạt động hoàn hảo bất kể màu sắc
SomaMan

60

Trong Swift Điều này đã làm việc cho tôi,

UIColor.white.withAlphaComponent(0).cgColor

3
Đừng quên thêm .cgColor như trong câu trả lời !!! Tôi vô tình sử dụng UIColor.white.withAlphaComponent (0) và đang vò đầu bứt tai trong một giờ tự hỏi tại sao nó vẫn có màu xám.
SnoopyProtocol

21

Đáng chỉ ra rằng bất kỳ màu nào khác sẽ hoạt động như thế này ... bằng cách sử dụng kết hợp hai câu trả lời ở trên ....

Mục tiêu 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];

Swift 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)


1

Các câu trả lời trên chẳng hạn như:

UIColor.white.withAlphaComponent(0).cgColor

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

sẽ hoạt động về mặt làm cho một phần gradient của bạn trở nên rõ ràng (thay vì màu xám mà OP đang đề cập đến). Tuy nhiên, nếu bạn vẫn nhìn thấy màu trắng trong suốt khi bạn đang nhìn thấy một màu rõ ràng, hãy đảm bảo rằng backgroundColorchế độ xem mà bạn đang áp dụng gradient cũng rõ ràng.

Theo mặc định, màu nền của chế độ xem đó có thể sẽ là màu trắng (hoặc màu tối nếu thiết bị ở chế độ tối), vì vậy khi bạn áp dụng gradient, phần rõ ràng của nó sẽ bị chính chế độ xem "chặn" backgroundColor. Đặt điều đó rõ ràng và bạn sẽ tốt để đi.


0

Như nhiều người, tôi vẫn có màu xám mặc dù sử dụng màu trắng trong.

Vì vậy, tôi đã thay đổi cách tiếp cận của mình và sử dụng một mặt nạ hơn là một gradient. Kết quả cuối cùng là giống nhau, tốt, tốt hơn, vì cái này hoạt động trong mọi tình huống, không chỉ nếu bạn có một nền tảng phù hợp.

Tôi đã không thử mã này với IB, nhưng hy vọng nó hoạt động tốt. Chỉ cần đặt backgroundColorvà bạn có thể đi.

@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()
    }
}

0

Cần lưu ý rằng để xử lý độ dốc màu trắng / đen (hoặc thực sự là bất kỳ màu nào có sự xuất hiện sáng / tối) dựa trên chế độ sáng / tối trong iOS 13, cách tiếp cận này cũng hoạt động với các màu hệ thống mới:

gradientLayer.colors = [
    UIColor.systemBackground.cgColor,
    UIColor.systemBackground.withAlphaComponent(0).cgColor] 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.