如何添加完全填充视图框架的渐变层

Posted

技术标签:

【中文标题】如何添加完全填充视图框架的渐变层【英文标题】:How to add gradient layer which fills the view frame exactly 【发布时间】:2018-01-30 12:03:22 【问题描述】:

在我的应用程序中,我将渐变层添加到 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(那个白色矩形),检查您是否不小心添加了一个视图 不,没有添加 UIView。我添加了 UIView 约束,它将等于设备或超级视图的宽度。它是最***的视图 你能发一张你的视图层次的截图吗? 添加了视图层次 我的意思是“Debug View Hierarchy”截图,当你的应用运行时,对不起 【参考方案1】:

根据您发布的图片,很难准确地判断您正在发生的事情,但是...这可能会为您简化事情。

首先,请记住图层不会自动缩放,因此当您的工具栏改变大小(不同设备、设备旋转等)时,您希望渐变图层调整大小。最好的方法是使用UIView 子类并覆盖layoutSubviews()

所以,将这个类添加到您的代码中:

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.这对 UIVeiw 也有用吗? 如果在 UIView 中添加 what?也许只是试一试?如果您尝试做的工作有效,那就太好了...如果没有,请尝试澄清您的问题。 是的,我明白了,它适用于我需要渐变的每个视图。我对代码添加了一些更改。感谢您的帮助

以上是关于如何添加完全填充视图框架的渐变层的主要内容,如果未能解决你的问题,请参考以下文章

如何给SVG填充和描边应用径向渐变

Photoshop 画布的渐变填充

如何为图案填充添加背景颜色?

如何给SVG填充和描边应用线性渐变

iOS - 调整视图层大小以填充 iPhone X Max 背景

将渐变层添加到表格视图