向 tableview 添加渐变会隐藏内容

Posted

技术标签:

【中文标题】向 tableview 添加渐变会隐藏内容【英文标题】:Adding a gradient to a tableview hides content 【发布时间】:2016-01-29 20:26:49 【问题描述】:

我有一个表格视图,它运行良好。但我必须在背景上添加渐变。我在 viewDidLoad 中用这段代码做到了:

gradientLayer.frame = self.view.bounds
let color1 = UIColor.blueColor().CGColor as CGColorRef
let color2 = UIColor.redColor().CGColor as CGColorRef
gradientLayer.colors = [color1, color2]
gradientLayer.locations = [0.0, 1.0]
gradientLayer.startPoint = CGPoint(x: 1, y: 0)
gradientLayer.endPoint = CGPoint(x: 0, y: 0)
self.view.layer.addSublayer(gradientLayer)
self.view.backgroundColor = UIColor.greenColor()

但现在我没有看到我的 tableview 的任何内容。

【问题讨论】:

不要使用self.view.layer.addSublayer(gradientLayer),试试self.layer.insertSublayer(gradientLayer, atIndex:0) @SauvikDolui 是的,它可以工作,但需要进行简单的更正。 self.view.layer.insertSublayer(gradientLayer, atIndex:0) 而不是 `self.layer.insertSublayer(gradientLayer, atIndex:0)。对于 Swift 3,atIndex 也刚刚变为 at。 【参考方案1】:

要适当配置背景渐变,您可以使用UITableViewbackgroundView 属性和带有CAGradientLayer 的视图。生成的代码(在 Swift 3 中)将是:

/* A small UIView subclass displaying gradient */

class GradientView: UIView 

    /* Overriding default layer class to use CAGradientLayer */
    override class var layerClass: AnyClass 
        return CAGradientLayer.self
    

    /* Handy accessor to avoid unnecessary casting */
    private var gradientLayer: CAGradientLayer 
        return layer as! CAGradientLayer
    

    /* Public properties to manipulate colors */
    public var fromColor: UIColor = UIColor.red 
        didSet 
            var currentColors = gradientLayer.colors
            currentColors![0] = fromColor.cgColor
            gradientLayer.colors = currentColors
        
    

    public var toColor: UIColor = UIColor.blue 
        didSet 
            var currentColors = gradientLayer.colors
            currentColors![1] = toColor.cgColor
            gradientLayer.colors = currentColors
        
    

    /* Initializers overriding to have appropriately configured layer after creation */
    override init(frame: CGRect) 
        super.init(frame: frame)
        gradientLayer.colors = [fromColor.cgColor, toColor.cgColor]
        gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
        gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        gradientLayer.colors = [fromColor.cgColor, toColor.cgColor]
        gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
        gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
    



/* Code that should be called in viewDidLoad method */

class MyViewController: UITableViewController 

    /* ... */

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.backgroundView = GradientView()
    

    /* ... */


【讨论】:

非常感谢!它确实有效。只有一件事,对不起,如何让它水平? 不客气!为每个配置水平渐变方向的初始化程序添加了 2 行。 它会给我错误???在下面的功能......?对于 swift 3: private var gradientLayer: CAGradientLayer return layer as! CAGradientLayer -> 无法将“CALayer”(0x10ac29de8)类型的值转换为“CAGradientLayer”(0x10ac2a838)。

以上是关于向 tableview 添加渐变会隐藏内容的主要内容,如果未能解决你的问题,请参考以下文章

将渐变层添加到表格视图

UITableViewCell 中的渐变出现在内容上

如何在情节提要中向原型 UITableViewCell 添加渐变背景颜色?

在 UITableViewCell 中添加渐变隐藏 UILabel 文本

ios在tableview单元格中显示/隐藏视图

手机网页版知乎内容隐藏效果的实现