Ответ 1
clearColor имеет канал черного цвета с альфой 0, поэтому мне пришлось использовать
[UIColor colorWithWhite:1 alpha:0]
и он отлично работает.
У меня есть 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];
Вот проблематичное представление:
clearColor имеет канал черного цвета с альфой 0, поэтому мне пришлось использовать
[UIColor colorWithWhite:1 alpha:0]
и он отлично работает.
В Swift Это сработало для меня,
UIColor.white.withAlphaComponent(0).cgColor
Стоит отметить, что любой другой цвет будет работать следующим образом... используя комбинацию из двух ответов выше...
Цель С
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)
Синтаксис Swift 3,
UIColor(white: 1, alpha: 0).cgColor
Как многие, я все еще получил серый цвет, несмотря на использование прозрачного белого.
Поэтому я изменил свой подход и выбрал маску, а не градиент. Конечный результат такой же, ну, лучше, так как этот работает во всех ситуациях, а не только если у вас есть подходящий фон.
Я не пробовал этот код с 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()
}
}
Стоит отметить, что для обработки градиентов белого/черного (или действительно любого цвета со светлыми/темными изображениями) на основе режима свет/темнота в iOS 13 этот подход также работает с новыми системными цветами:
gradientLayer.colors = [
UIColor.systemBackground.cgColor,
UIColor.systemBackground.withAlphaComponent(0).cgColor]