首页 文章

UIView Shadow Gradient

提问于
浏览
15

我在我的iOS项目中创建了一个自定义UIView,它有一个投影 . 我的目标是将相同的渐变应用于阴影,就像在视图的背景上一样 .

下面是我当前纯色阴影的外观示例 .

Shadow Example
这是通过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 回答

  • 4

    我认为你不能用标准的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

    禁用标准图层阴影并将模糊图层添加为子图层 .

  • 0

    我相信@jacek是对的,你正在推动使用 CALayer 阴影所做的极限(这不是很诚实)

    像jacek解释的最好的事情是创建自己的阴影,尽管另一个 CAGradientLayer 应用高斯模糊作为阴影 .

    此外,我不相信将您的代码放在 layoutSubviews 内是最合适的地方 . 一旦配置,您的图层将不需要进行太多更改,因此如果您的布局发生很大变化,它将被调用很多 .

    通常,如果使用来自interface-builder的视图,我会在专用的 configureBackgroundViews 函数中从 awakeFromNib 调用此逻辑 .

  • 0

    根据我的gitRepo https://github.com/Krishnarjun-Banoth/BlurView/tree/master/Shadows中提供的要求使用我的代码

    第1步:只需将 BlurEffect.swift 文件拖放到项目中即可 .

    第2步:然后只需单独使用下面的查看扩展方法为您的每个视图单独 .

    testView.applyGradient(colours: [UIColor.blue,UIColor.orange]) //pass your required colours.
      testView.blur(blurRadius: 5.0)
    

    注意:灵感来自@JacekGłazik的回答和FlexMonkey的教程 .

相关问题