将垂直alpha渐变应用于UITableView

时间:2014-08-18 00:54:47

标签: swift uitableview nsarray linear-gradients

我是iOS开发的新手,我正在尝试学习Swift。我想将垂直alpha渐变应用于UITableView,但遇到了一些麻烦。

最初关注this SO post,我做了以下事情:

var gradientMaskLayer:CAGradientLayer = CAGradientLayer()
gradientMaskLayer.frame = myTableView.bounds
gradientMaskLayer.colors = [UIColor.clearColor().CGColor, UIColor.blackColor().CGColor]
gradientMaskLayer.locations = [0.0, 0.05]
myTableView.layer.mask = gradientMaskLayer

收到错误Array element cannot be bridged to Objective-C并阅读this SO post后,我修改了使用的两个数组:

var gradientMaskLayer:CAGradientLayer = CAGradientLayer()
var gradientMaskColors:NSArray = [UIColor.clearColor().CGColor, UIColor.blackColor().CGColor]
var gradientMaskLocations:NSArray = [0.0, 0.05]
gradientMaskLayer.frame = myTableView.bounds
gradientMaskLayer.colors = gradientMaskColors
gradientMaskLayer.locations = gradientMaskLocations
myTableView.layer.mask = gradientMaskLayer

现在收到错误Value failed to bridge from Swift type to a Objective-C type

我正在努力寻找解决方案。可以提供一些帮助吗?

2 个答案:

答案 0 :(得分:26)

您应该屏蔽superview,而不是视图本身。

以下是一个例子:

let gradient = CAGradientLayer()

gradient.frame = tableView.superview?.bounds ?? .null
gradient.colors = [UIColor.clear.cgColor, UIColor.clear.cgColor, UIColor.black.cgColor, UIColor.black.cgColor, UIColor.clear.cgColor, UIColor.clear.cgColor]
gradient.locations = [0.0, 0.15, 0.25, 0.75, 0.85, 1.0]
tableView.superview?.layer.mask = gradient

tableView.backgroundColor = .clear

<强>结果:

Mask + TableView

您可以通过更改startPointendpoint属性来更改方向。默认值(垂直)分别为(0.5,0.0)和(0.5,1)。点(0,0)是图层的左下角,(1,1)是右上角。例如,如果要水平而不是垂直应用该蒙版,只需执行:

gradient.startPoint = .init(x: 0.0, y: 0.5)
gradient.endPoint = .init(x: 1.0, y: 0.5)

还有一件事:如果您使用 AutoLayout ,则需要使用正确的CGRect值更新图层。我通常会覆盖layoutSubviews()方法来更新它,如gradient.frame = tableView.superview?.bounds ?? .null

答案 1 :(得分:4)

所以我相信我有一个问题的解决方案,但我不确定我是否完全理解它。当您尝试创建一个隐式展开的AnyObject数组时,似乎会出现问题,该数组只包含 隐式解包的Core Foundation类型,即:

let implicitlyUnwrappedCGColor:CGColor! = UIColor.clearColor().CGColor
let implicitlyUnwrappedAnyObjectArray:[AnyObject]! = [implicitlyUnwrappedCGColor]

给出array element cannot be bridged to Objective-C错误。

感觉这必须是一个Swift编译器问题,特别是如下所示,其中隐式展开的CGColor被声明为隐式展开的AnyObject,似乎让编译器再次开心:

let implicitlyUnwrappedCGColor:AnyObject! = UIColor.clearColor().CGColor
let implicitlyUnwrappedAnyObjectArray:[AnyObject]! = [implicitlyUnwrappedCGColor]

将标准Objective-C对象粘贴到数组中:

let implicitlyUnwrappedCGColor:CGColor! = UIColor.clearColor().CGColor
let uiColor = UIColor.clearColor()
let implicitlyUnwrappedAnyObjectArray:[AnyObject]! = [implicitlyUnwrappedCGColor, uiColor]

在任何情况下,请尝试以下方法解决您的问题:

var gradientMaskLayer:CAGradientLayer = CAGradientLayer()
gradientMaskLayer.frame = myTableView.bounds
gradientMaskLayer.colors = [UIColor.clearColor().CGColor!, UIColor.blackColor().CGColor!]
gradientMaskLayer.locations = [0.0, 0.05]
myTableView.layer.mask = gradientMaskLayer