如何添加完全填充视图框架的渐变层
How to add gradient layer which fills the view frame exactly
在我的应用程序中,我将渐变层添加到 UIView 和 UIToolBar,但它没有完全填充视图
let gradient:CAGradientLayer = CAGradientLayer()
gradient.frame = self.vw_gradientForToolBar.bounds
gradient.colors = [hexStringToUIColor(hex: "#5d8f32").cgColor,hexStringToUIColor(hex: "#04667f").cgColor]
gradient.startPoint = CGPoint(x: 0, y: 0)
gradient.endPoint = CGPoint(x: 0.5, y: 0)
UIGraphicsBeginImageContextWithOptions(CGSize(width: 1, height: 1), false, 0.0)
let img : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
self.toolBar.setBackgroundImage(img, forToolbarPosition: .any, barMetrics: .default)
vw_gradientForToolBar.layer.addSublayer(gradient)
查看层次结构
在此处输入图片描述
根据您发布的图片,很难确切地说出您在做什么,但是...这可能会简化您的操作。
首先,请记住图层不会自动缩放,因此当您的工具栏改变大小时(不同的设备、设备旋转等),您希望您的渐变图层也 调整大小。最好的方法是使用 UIView
subclass 并覆盖 layoutSubviews()
.
因此,将此 class 添加到您的代码中:
class GradientView: UIView {
override class var layerClass: AnyClass {
return CAGradientLayer.self
}
override func layoutSubviews() {
let gradientLayer = layer as! CAGradientLayer
gradient.colors = [hexStringToUIColor(hex: "#5d8f32").cgColor,hexStringToUIColor(hex: "#04667f").cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 0)
}
}
然后在控制器的 viewDidLoad()
函数中:
override func viewDidLoad() {
super.viewDidLoad()
let vwGrad = GradientView()
vwGrad.frame = toolBar.frame
vwGrad.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.toolBar.insertSubview(vwGrad, at: 0)
}
注意:您将不再需要 vw_gradientForToolBar
(我假设它是通过 @IBOutlet
连接的 UIView
)。
在我的应用程序中,我将渐变层添加到 UIView 和 UIToolBar,但它没有完全填充视图
let gradient:CAGradientLayer = CAGradientLayer()
gradient.frame = self.vw_gradientForToolBar.bounds
gradient.colors = [hexStringToUIColor(hex: "#5d8f32").cgColor,hexStringToUIColor(hex: "#04667f").cgColor]
gradient.startPoint = CGPoint(x: 0, y: 0)
gradient.endPoint = CGPoint(x: 0.5, y: 0)
UIGraphicsBeginImageContextWithOptions(CGSize(width: 1, height: 1), false, 0.0)
let img : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
self.toolBar.setBackgroundImage(img, forToolbarPosition: .any, barMetrics: .default)
vw_gradientForToolBar.layer.addSublayer(gradient)
查看层次结构
在此处输入图片描述
根据您发布的图片,很难确切地说出您在做什么,但是...这可能会简化您的操作。
首先,请记住图层不会自动缩放,因此当您的工具栏改变大小时(不同的设备、设备旋转等),您希望您的渐变图层也 调整大小。最好的方法是使用 UIView
subclass 并覆盖 layoutSubviews()
.
因此,将此 class 添加到您的代码中:
class GradientView: UIView {
override class var layerClass: AnyClass {
return CAGradientLayer.self
}
override func layoutSubviews() {
let gradientLayer = layer as! CAGradientLayer
gradient.colors = [hexStringToUIColor(hex: "#5d8f32").cgColor,hexStringToUIColor(hex: "#04667f").cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 0)
}
}
然后在控制器的 viewDidLoad()
函数中:
override func viewDidLoad() {
super.viewDidLoad()
let vwGrad = GradientView()
vwGrad.frame = toolBar.frame
vwGrad.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.toolBar.insertSubview(vwGrad, at: 0)
}
注意:您将不再需要 vw_gradientForToolBar
(我假设它是通过 @IBOutlet
连接的 UIView
)。