我是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
我正在努力寻找解决方案。可以提供一些帮助吗?
答案 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
<强>结果:强>
您可以通过更改startPoint
和endpoint
属性来更改方向。默认值(垂直)分别为(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