我在我的iOS项目中创建了一个自定义UIView,它有一个投影 . 我的目标是将相同的渐变应用于阴影,就像在视图的背景上一样 .
下面是我当前纯色阴影的外观示例 .
这是通过UIView的子类完成的,代码如下:
override func layoutSubviews() {
let gradientLayer = layer as! CAGradientLayer
gradientLayer.colors = [topColor.cgColor, bottomColor.cgColor]
gradientLayer.startPoint = CGPoint(x: startPointX, y: startPointY)
gradientLayer.endPoint = CGPoint(x: endPointX, y: endPointY)
layer.cornerRadius = cornerRadius
layer.shadowColor = shadowColor.cgColor
layer.shadowOffset = CGSize(width: shadowX, height: shadowY)
layer.shadowRadius = shadowBlur
layer.shadowOpacity = 1
let inset: CGFloat = bounds.width * 0.05
layer.shadowPath = UIBezierPath(roundedRect: bounds.insetBy(dx: inset, dy: 0.0), cornerRadius: cornerRadius).cgPath
}
我一直在玩创建第二个渐变层并将其遮盖到阴影中,但没有运气 . 请指出我正确的方向!
3 回答
我认为你不能用标准的CALayer阴影做更多的事情 . 看看CALayer的 filters 属性 .
https://developer.apple.com/documentation/quartzcore/calayer/1410901-filters
例如,创建第二个 CAGradientLayer 并应用 GausianBlur 过滤器 .
https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIGaussianBlur
禁用标准图层阴影并将模糊图层添加为子图层 .
我相信@jacek是对的,你正在推动使用
CALayer
阴影所做的极限(这不是很诚实)像jacek解释的最好的事情是创建自己的阴影,尽管另一个
CAGradientLayer
应用高斯模糊作为阴影 .此外,我不相信将您的代码放在
layoutSubviews
内是最合适的地方 . 一旦配置,您的图层将不需要进行太多更改,因此如果您的布局发生很大变化,它将被调用很多 .通常,如果使用来自interface-builder的视图,我会在专用的
configureBackgroundViews
函数中从awakeFromNib
调用此逻辑 .根据我的gitRepo https://github.com/Krishnarjun-Banoth/BlurView/tree/master/Shadows中提供的要求使用我的代码
第1步:只需将 BlurEffect.swift 文件拖放到项目中即可 .
第2步:然后只需单独使用下面的查看扩展方法为您的每个视图单独 .
注意:灵感来自@JacekGłazik的回答和FlexMonkey的教程 .