UIView左右阴影

Posted

技术标签:

【中文标题】UIView左右阴影【英文标题】:Shadow left and right of UIView 【发布时间】:2013-01-08 16:19:52 【问题描述】:

您好,我喜欢向视图中添加 CALayer 阴影,其中阴影位于视图的左右,最简单的方法是:

someView.layer.shadowColor = [[UIColor blackColor] CGColor];
someView.layer.shadowOffset = CGSizeMake(0.0f,0.0f);
someView.layer.shadowOpacity = 1.0f;
someView.layer.shadowRadius = 10.0f;
someView.layer.shadowPath = [[UIBezierPath bezierPathWithRect:someView.bounds] CGPath];

但是当我增加 shadowRadius 它看起来不太好时,我会添加一个更大的阴影,就像一个阴影一样。如何制作左右两边都好看的阴影。

【问题讨论】:

【参考方案1】:

我认为 10 是一个相当大的阴影半径,尝试 3 或 4 代替,不透明度我通常使用 0.7:

someView.layer.shadowColor = [[UIColor blackColor] CGColor];
someView.layer.shadowOffset = CGSizeMake(0.0f,0.0f);
someView.layer.shadowOpacity = 0.7f;
someView.layer.shadowRadius = 4.0f;

如果您只想要左右阴影,则在顶部和底部插入矩形,以便顶部和底部阴影隐藏在您的视图后面:

CGRect shadowRect = CGRectInset(someView.bounds, 0, 4);  // inset top/bottom
someView.layer.shadowPath = [[UIBezierPath bezierPathWithRect:shadowRect] CGPath];

我不确定这是否是你想要的。

【讨论】:

我和我的设计师谈过这个影子太小了。我需要左右不同的 x 偏移量。 惊人的答案,但是有人用圆角实现了这个(更平滑),因为这个类似矩形的阴影看起来很糟糕。有什么见解吗?提前致谢 ! :) 使用 bezierPathWithRoundedRect 代替 我不知道为什么会有这么多选票。在我的实现中,正如预期的那样,它可以防止侧面阴影一直到达侧面的顶部和底部。 @progrmr 我想要具有特定侧面的内部阴影,例如仅顶部或顶部/右侧。有什么建议吗?【参考方案2】:

swift 3.0 版本

imageView.layer.shadowOpacity = 0.8
imageView.layer.shadowOffset = CGSize(width: 0, height: 3)
imageView.layer.shadowRadius = 4.0

let shadowRect: CGRect = imageView.bounds.insetBy(dx: 0, dy: 4)
imageView.layer.shadowPath = UIBezierPath(rect: shadowRect).cgPath

【讨论】:

【参考方案3】:

progrmr 的回答很有帮助,干杯!

我制作了一个滑出式菜单,但我遇到了 VC 周围的阴影并破坏了导航栏的问题。结果我不得不插入阴影层。

这是我使用 swift 的解决方案:

rightViewController!.view.layer.shadowOpacity = 0.8
rightViewController!.view.layer.shadowOffset = CGSizeMake(0, 3)
rightViewController!.view.layer.shadowRadius = 4.0

let shadowRect: CGRect = CGRectInset(rightViewController!.view.bounds, 0, 4);  // inset top/bottom
rightViewController!.view.layer.shadowPath = UIBezierPath(rect: shadowRect).CGPath

【讨论】:

【参考方案4】:

我创建了一个可以在顶部/底部或左侧/右侧使用的阴影,完全没有偏见。如果选择上/下,左/右将不会出现阴影,依此类推。我希望我有所帮助。代码如下:


import UIKit

class ViewController: UIViewController 
  
    
     override func viewDidLoad() 
        super.viewDidLoad()
        
        let imgView = UIImageView(frame: CGRect(x: self.view.bounds.midX - 150, y: self.view.bounds.midY - 150, width: 300, height: 300))
            
        imgView.contentMode = .scaleToFill
        imgView.image = UIImage(named: "name image")

        self.view.addSubview(imgView)
        //You can put left/right or top/bottom
        imgView.addShadow(sides: .leftRight, constant: 10, alpha: 5)

        
     



extension UIView
    
    func addShadow(sides: Sides, constant: Int, alpha: Int)
        if(constant > 0 && alpha > 0)
        switch sides 
            case .leftRight:
   
                let view = UIView(frame: CGRect(x: -CGFloat(constant), y: 0, width: self.bounds.width + CGFloat((constant * 2)), height: self.bounds.height))
                self.addSubview(view)

                addMask(sides: .leftRight, view: view, constant: constant, shadowRadius: alpha)
                
            case .topBottom:

                let view = UIView(frame: CGRect(x: 0, y: -CGFloat(constant), width: self.bounds.width , height: self.bounds.height + CGFloat(constant * 2)))
                self.addSubview(view)

                addMask(sides: .topBottom, view: view, constant: constant, shadowRadius: alpha)

            
        
    
    
    private func addMask(sides:Sides, view: UIView, constant: Int, shadowRadius:Int)
        let mutablePath = CGMutablePath()
        let mask = CAShapeLayer()

        switch sides 
        case .leftRight:
            
            mutablePath.addRect(CGRect(x: -CGFloat(constant), y: 0, width: view.bounds.width, height: view.bounds.height))

            mutablePath.addRect(CGRect(x: CGFloat(constant) , y: 0, width: view.bounds.width , height: view.bounds.height))

            
        case .topBottom:
            
            mutablePath.addRect(CGRect(x: 0, y: -CGFloat(constant), width: view.bounds.width, height: view.bounds.height))

            mutablePath.addRect(CGRect(x: 0, y: CGFloat(constant) , width: view.bounds.width , height: view.bounds.height))
        

        mask.path = mutablePath

        mask.fillRule = CAShapeLayerFillRule.evenOdd
        mask.fillColor  = UIColor(white:1.0, alpha: 0.2).cgColor
        view.layer.mask = mask
        view.layer.addSublayer(mask)
        mask.shadowColor = UIColor.black.cgColor
        mask.shadowRadius = CGFloat(shadowRadius)
        mask.shadowOpacity = 1.0
        mask.shadowOffset = CGSize(width: 0, height: 0)

    


enum Sides
    case leftRight
    case topBottom


你只需要调用扩展UIView,它有addShadow()函数并传递你想要的参数。

【讨论】:

以上是关于UIView左右阴影的主要内容,如果未能解决你的问题,请参考以下文章

如何在UIView下绘制阴影

为选定的边缘 UIView 添加阴影

如何在 UIView 下绘制阴影?

保留蒙面 UIView 的阴影

iOS Swift如何为透明的UIView添加阴影

在 UIView 上添加两个不同颜色的阴影?