【问题标题】:Swift: Adding gradient layer to button. Layer length errorSwift:向按钮添加渐变层。层长错误
【发布时间】:2016-06-16 03:22:16
【问题描述】:
let gradient: CAGradientLayer = CAGradientLayer()
let colorTop = UIColor(red: 112.0/255.0, green: 219.0/255.0, blue: 155.0/255.0, alpha: 1.0).CGColor
let colorBottom = UIColor(red: 86.0/255.0, green: 197.0/255.0, blue: 238.0/255.0, alpha: 1.0).CGColor

gradient.colors = [colorTop, colorBottom]
gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
gradient.frame = loginButton.bounds
gradient.cornerRadius = 5
loginButton.layer.addSublayer(gradient)

生成的渐变超出了按钮的框架。为什么会这样?

【问题讨论】:

  • 也许尝试将渐变层的bounds 属性设置为与 loginButton 层的属性相同?

标签: ios swift core-animation gradient


【解决方案1】:

可能您在 viewDidLoad() 或 viewWillAppear() 中设置渐变层。当时控制器没有计算视图大小。在您添加此子层按钮时尚未计算大小,因此子层大小是错误的。所以你应该解决接下来的事情:

  1. 首先您应该在 viewDidAppear() 中添加渐变,此时所有视图的大小都已计算完毕。
  2. 其次,您应该使用 layer.insertSublayer(layer, atIndex:index) 而不是 addSublayer(layer)。因为在您的情况下,子层将隐藏按钮本机层(标题、背景...)
  3. 您应该在 viewDidLayoutSubviews() 中重新计算您的子层大小。因为当你的按钮改变它的大小时(例如旋转时),子层不会改变它的框架,所以你应该自己改变它。

【讨论】:

  • 谢谢!将我的代码放入 viewWillAppear 可以解决问题。
  • 您介意回答一个快速的后续问题吗?将代码放入 viewdidload 后,此视图控制器的 segues 看起来很糟糕,因为动画 vc 没有附加渐变。我该如何解决这个问题?
  • 抱歉,回复晚了,很忙。你可以做接下来的事情:1.子类uibutton,在那里设置CAGradientLayer属性,在init方法中添加这个层并覆盖layoutSubviews()方法,你应该重新计算CAGradientLayer的框架,如:gradientLayer.frame = button.bounds; 2.可以在controller中创建这个layer属性,在viewDidLoad中添加到button,在viewDidLayoutSubview中重新计算layer的frame。我会使用第一种方法。
【解决方案2】:

将clipsToBounds 和cornerRadius 添加到登录按钮。这应该可以解决问题。

loginButton.clipsToBounds = true
loginButton.layer.cornerRadius = 5;

【讨论】:

  • 很好的答案。我使用的是自定义按钮,因此我可以从启动屏幕调整边框颜色、半径和所有内容,并在创建渐变背景时,颜色溢出边框。将 clipsToBounds = true 添加到我的自定义按钮解决了这个问题。谢谢。
【解决方案3】:

您的登录按钮的框架是否正确?当我重现时它似乎正确

        let loginButton = UIButton(frame: CGRect(x: 10, y: 50, width: 300, height: 30))
        self.view.addSubview(loginButton)

        let gradient:CAGradientLayer = CAGradientLayer()
        let colorTop = UIColor(red: 112.0/255.0, green: 219.0/255.0, blue: 155.0/255.0, alpha: 1.0).CGColor
        let colorBottom = UIColor(red: 86.0/255.0, green: 197.0/255.0, blue: 238.0/255.0, alpha: 1.0).CGColor

        gradient.colors = [colorTop, colorBottom]
        gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
        gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
        gradient.frame = loginButton.bounds
        gradient.cornerRadius = 5

        loginButton.layer.addSublayer(gradient)

如下图所示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多