渐变本身使用CAGradientLayer 女巫是CALayer 而不是UIView。所以视图布局不会影响它。
自定义类
你可以使用我写的这个类:
class GradientView: UIView {
var colors: [UIColor]? { didSet { syncColors() } }
var direction: GradientDirection = .topToBottom {
didSet {
layer.startPoint = direction.startPoint
layer.endPoint = direction.endPoint
}
}
enum GradientDirection {
case rightToLeft
case leftToRight
case bottomToTop
case topToBottom
case custom(startPoint: CGPoint,endPoint: CGPoint)
var startPoint: CGPoint {
switch self {
case .rightToLeft: return CGPoint(x: 1, y: 0)
case .leftToRight: return .zero
case .bottomToTop: return CGPoint(x: 0, y: 1)
case .topToBottom: return .zero
case .custom(let startPoint, _): return startPoint
}
}
var endPoint: CGPoint {
switch self {
case .rightToLeft: return .zero
case .leftToRight: return CGPoint(x: 1, y: 0)
case .bottomToTop: return .zero
case .topToBottom: return CGPoint(x: 0, y: 1)
case .custom(_, let endPoint): return endPoint
}
}
static var interfaceDirection: GradientDirection {
switch UIApplication.shared.userInterfaceLayoutDirection {
case .leftToRight: return .leftToRight
case .rightToLeft: return .rightToLeft
}
}
}
override class var layerClass: AnyClass { return CAGradientLayer.self }
override var layer: CAGradientLayer { return super.layer as! CAGradientLayer }
override func layoutSubviews() { syncColors() }
private func syncColors() { layer.colors = colors?.map() { $0.cgColor } }
}
简化类
借助这个简单的类:
enum GradientDirection {
case rightToLeft
case leftToRight
case bottomToTop
case topToBottom
case custom(startPoint: CGPoint,endPoint: CGPoint)
var startPoint: CGPoint {
switch self {
case .rightToLeft: return CGPoint(x: 1, y: 0)
case .leftToRight: return .zero
case .bottomToTop: return CGPoint(x: 0, y: 1)
case .topToBottom: return .zero
case .custom(let startPoint, _): return startPoint
}
}
var endPoint: CGPoint {
switch self {
case .rightToLeft: return .zero
case .leftToRight: return CGPoint(x: 1, y: 0)
case .bottomToTop: return .zero
case .topToBottom: return CGPoint(x: 0, y: 1)
case .custom(_, let endPoint): return endPoint
}
}
static var interfaceDirection: GradientDirection {
switch UIApplication.shared.userInterfaceLayoutDirection {
case .leftToRight: return .leftToRight
case .rightToLeft: return .rightToLeft
}
}
}
那么你就有了一个普通视图,它可以对来自超级视图的任何布局通知做出反应。
用法
只需添加子视图并将类设置为GradientView 并使用自动布局或您想要的任何其他布局进行布局。
或使用代码:
let gradientView: GradientView = {
let gradientView = GradientView(frame: self.frame)
gradientView.colors = [
UIColor.black.withAlphaComponent(1),
UIColor.black.withAlphaComponent(0)
]
gradientView.direction = .bottomToTop
return gradientView
}()
请注意,如果您希望它具有一定的透明度,则需要删除视图的原始backgroundColor。