在 UIView 上应用渐变不起作用

Posted

技术标签:

【中文标题】在 UIView 上应用渐变不起作用【英文标题】:Apply gradient on a UIView not working 【发布时间】:2016-07-16 11:11:10 【问题描述】:

我正在尝试以编程方式向 UIView 添加渐变,但它不起作用。它似乎根本没有颜色。我附上了相关代码和截图。注意我正在应用渐变的底部正方形。有人可以帮我弄清楚我在这里做错了什么吗?

let sundayView = UIView()

override func viewDidLoad() 
    super.viewDidLoad()
    setupViews()
    setupSundayView()


func setupViews() 
    sundayView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(sundayView)


func setupSundayView() 
    sundayView.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activateConstraints([
        sundayView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor),
        sundayView.topAnchor.constraintEqualToAnchor(fridayView.bottomAnchor, constant: 16.0),
        sundayView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor, constant: -8.0),            
        sundayView.heightAnchor.constraintEqualToAnchor(mondayView.heightAnchor),
        sundayView.widthAnchor.constraintEqualToAnchor(mondayView.widthAnchor)
        ])

    let gradient = CAGradientLayer()
    gradient.frame = sundayView.bounds
    gradient.colors = [
        UIColor(red:1.00, green:0.37, blue:0.23, alpha:1.0).CGColor,
        UIColor(red:1.00, green:0.16, blue:0.41, alpha:1.0).CGColor
    ]
    sundayView.layer.insertSublayer(gradient, atIndex: 0)

【问题讨论】:

你不是忘了导入QuartzCore框架吗? 我想没有必要。我尝试将渐变应用于我的超级视图。它无需导入即可工作。 【参考方案1】:

您的渐变未显示,因为在 自动布局 运行之前不会设置 sundayViewbounds。覆盖viewDidLayoutSubviews 并在那里设置渐变框架。

将此属性添加到您的 viewController:

var sundayGradient: CAGradientLayer?

setupSundayView 中将gradient 保存到属性中:

let gradient = CAGradientLayer()
sundayGradient = gradient

然后在viewDidLayoutSubviews中设置框架:

override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()

    sundayGradient?.frame = sundayView.bounds

【讨论】:

Ummm.. 抱歉,我无法理解 将渐变设置为它 代码。拜托,你能再解释一下吗? :) setupSundayViewlet gradient = CAGradientLayer() 之后添加行sundayGradient = gradient 谢谢!它有效:) 但它破坏了我添加的另一行代码:sundayView.layer.cornerRadius = 5 设置sundayView.clipsToBounds = true.【参考方案2】:

好像忘记在渐变层添加locations了,试试这样:

func setupSundayView() 
    sundayView.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activateConstraints([
        sundayView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor),
        sundayView.topAnchor.constraintEqualToAnchor(fridayView.bottomAnchor, constant: 16.0),
        sundayView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor, constant: -8.0),            
        sundayView.heightAnchor.constraintEqualToAnchor(mondayView.heightAnchor),
        sundayView.widthAnchor.constraintEqualToAnchor(mondayView.widthAnchor)
        ])

    let gradient = CAGradientLayer()
    gradient.frame = sundayView.bounds
    gradient.colors = [
        UIColor(red:1.00, green:0.37, blue:0.23, alpha:1.0).CGColor,
        UIColor(red:1.00, green:0.16, blue:0.41, alpha:1.0).CGColor
    ]
    gradient.locations = [0.0, 0.5]
    sundayView.layer.insertSublayer(gradient, atIndex: 0)

【讨论】:

好的,在您的viewDidLoad 中尝试在setupViews() 之前调用setupSundayView() 函数。 这是 sundayView 帧。我尝试添加 sundayView.frame.size = CGSize(width: 130, height: 130) 成功了。 但这现在覆盖了我的 heightAnchor 和 widthAnchor。有什么方法可以在不定义大小的情况下初始化框架?

以上是关于在 UIView 上应用渐变不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥伪元素上的过滤器渐变在 IE8 中不起作用?

链接在div内不起作用,容器上具有渐变

CSS渐变在iOS上不起作用

UIView 上的渐变蒙版

UIView clipsToBounds不起作用

CSS背景(渐变)过渡不起作用