我编写了代码,该代码可在iPhone X上使用,但不适用于iPhone SE。 Here's what we have on iPhone SE
有人知道为什么它可以在iPhone X上正常工作而不能在iPhone SE上
我在viewDidLayoutSubviews()中调用此函数
extension UIView {
enum Direction {
case horizontal
case vertical
}
func addGradient(cornerRadius: CGFloat, colors: [UIColor], lineWidth: CGFloat, direction: Direction) {
self.layer.cornerRadius = cornerRadius
let gradient = CAGradientLayer()
gradient.frame = bounds
gradient.colors = colors.map({ (color) -> CGColor in
color.cgColor
})
switch direction {
case .horizontal:
gradient.startPoint = CGPoint(x: 0, y: 1)
gradient.endPoint = CGPoint(x: 1, y: 1)
case .vertical:
gradient.startPoint = CGPoint(x: 0, y: 0)
gradient.endPoint = CGPoint(x: 0, y: 1)
}
var shadowLayer: CAShapeLayer!
shadowLayer = CAShapeLayer()
shadowLayer.lineWidth = lineWidth
shadowLayer.path = UIBezierPath(roundedRect: self.bounds.insetBy(dx: lineWidth, dy: lineWidth), cornerRadius: cornerRadius).cgPath
shadowLayer.fillColor = nil
shadowLayer.strokeColor = UIColor.black.cgColor
gradient.mask = shadowLayer
self.layer.addSublayer(gradient)
}
}
答案 0 :(得分:0)
由于viewDidLayoutSubviews
被多次调用,因此必须确保仅创建一次渐变图层。添加这样的支票:
func addGradient(cornerRadius: CGFloat, colors: [UIColor], lineWidth: CGFloat, direction: Direction) {
self.layer.cornerRadius = cornerRadius
if let gradient = self.layer.sublayers?.last as? CAGradientLayer {
// gradient layer already exists - update its frame
gradient.frame = bounds
} else {
// gradient layer does not exist yet - create it
let gradient = CAGradientLayer()
gradient.frame = bounds
gradient.colors = colors.map({ (color) -> CGColor in
color.cgColor
})
switch direction {
case .horizontal:
gradient.startPoint = CGPoint(x: 0, y: 1)
gradient.endPoint = CGPoint(x: 1, y: 1)
case .vertical:
gradient.startPoint = CGPoint(x: 0, y: 0)
gradient.endPoint = CGPoint(x: 0, y: 1)
}
var shadowLayer: CAShapeLayer!
shadowLayer = CAShapeLayer()
let rectPath = UIBezierPath(roundedRect: self.bounds.insetBy(dx: lineWidth, dy: lineWidth), cornerRadius: cornerRadius).cgPath
shadowLayer.path = rectPath
shadowLayer.lineWidth = lineWidth
shadowLayer.fillColor = nil
shadowLayer.strokeColor = UIColor.black.cgColor
gradient.mask = shadowLayer
self.layer.addSublayer(gradient)
}
}