【问题标题】:Why gradient layer in UITableViewCell not cover entire frame?为什么 UITableViewCell 中的渐变层不覆盖整个框架?
【发布时间】:2018-06-04 20:37:54
【问题描述】:

我尝试用长 UIView 制作标准渐变上下。但它并不完整。笔尖是 UITableViewCell 的一部分,所以我无法访问 viewDidLayoutSubviews(),就像在 this thread 中一样。

我尝试从该视图的代码版本调用contentView.layoutIfNeeded()。当 UITableView cellForRowAtIndexPath 被调用时,我调用了它。但它没有效果。

我在awakeFromNib()中准备渐变。

let colors = [
            UIColor(red: 33/255.0, green: 33/255.0, blue: 33/255.0, alpha: 1.0).cgColor,
            UIColor(red: 51/255.0, green: 51/255.0, blue: 51/255.0, alpha: 1.0).cgColor]
let gradient = CAGradientLayer()
gradient.frame = gradientView.bounds
gradient.colors = colors
gradientView.layer.insertSublayer(gradient, at: 0) 

我的代码有问题吗?

【问题讨论】:

标签: ios swift uitableview uiview cagradientlayer


【解决方案1】:

您应该使用视图的bounds而不是frame,因为您的图层位于视图内部,并且框架可能有偏移。

awakeFromNib 之后视图的布局发生了变化。所以你应该在视图的layoutSubviews 中调整图层的大小。为此创建一个属性gradient 并:

let gradient: CAGradientLayer = CAGradientLayer()

override func awakeFromNib() {
    ...
    let colors = [
                UIColor(red: 33/255.0, green: 33/255.0, blue: 33/255.0, alpha: 1.0).cgColor,
                UIColor(red: 51/255.0, green: 51/255.0, blue: 51/255.0, alpha: 1.0).cgColor]
    gradient.frame = bounds
    gradient.colors = colors
    gradientView.layer.insertSublayer(gradient, at: 0) 
    ...
}

override func layoutSubviews() {
    super.layoutSubviews()
    gradient.frame = bounds
}

编辑:另一种方法是具有自己的图层类的自定义视图:

public class GradientLayer: UIView {
    @IBInspectable var startColor: UIColor! = UIColor(red: 33/255.0, green: 33/255.0, blue: 33/255.0, alpha: 1.0)
    @IBInspectable var endColor: UIColor! = UIColor(red: 51/255.0, green: 51/255.0, blue: 51/255.0, alpha: 1.0)

    override class var layerClass : AnyClass {
        return CAGradientLayer.self
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        let colors = [ startColor.cgColor, endColor.cgColor ]
        if let gradient = self.layer as? CAGradientLayer {
            gradient.colors = colors
        }
    }
}

这样更优雅,因为您可以将静态颜色替换为 IB 检查项,并且您拥有可重用的组件视图。

【讨论】:

  • 好一个因此+1
  • 对不起,我的问题中的错字。它实际上是在渐变视图中使用bounds。无论如何,我会试试你的解决方案。
  • 我刚刚看到该图层属于另一个视图。我已经更改了代码,但我认为如果包含图层 (gradientView) 的视图能够管理图层的布局会更好。
  • @clemens 我接受你的回答。感谢您提及 IB 检查项
  • @Anbu.karthik 啊,我明白了。谢谢。
【解决方案2】:
 override func layoutSubviews() {
        super.layoutSubviews()

        if let gradient = baseView.layer.sublayers?[0] as? CAGradientLayer {
            gradient.frame = self.bounds
        }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多