【问题标题】:add Shadow on UIView using swift 3使用 swift 3 在 UIView 上添加阴影
【发布时间】:2017-01-30 04:24:10
【问题描述】:

在 swift 3 之前,我像这样在 UIView 中添加阴影:

//toolbar is an UIToolbar (UIView)
toolbar.layer.masksToBounds = false
toolbar.layer.shadowOffset = CGSize(width: -1, height: 1)
toolbar.layer.shadowRadius = 1
toolbar.layer.shadowOpacity = 0.5

但上面的代码在 swift 3 中不起作用,而不是阴影,我的整个 View 的颜色变成了丑陋的灰色

谁知道我们如何在 swift 3 中添加阴影?

【问题讨论】:

    标签: ios swift3


    【解决方案1】:

    我建议你使用下面的库,因为它允许你在一个文件中设置默认值,你可以在项目中的任何地方使用它,而无需进行一行更改。 https://github.com/Shahbaz89khan/ShadowView

    【讨论】:

      【解决方案2】:

      Shadow 使用 UIView Extension Swift 4

      我想再添加一行选择的答案! 当我们对图层进行栅格化时,需要将其设置为 2.0 以用于视网膜显示。否则,该视图上的标签文本或图像将变得模糊。所以我们还需要添加rasterizationScale

        extension UIView {
      
          func dropShadow() {
              layer.masksToBounds = false
              layer.shadowColor = UIColor.black.cgColor
              layer.shadowOpacity = 0.5
              layer.shadowOffset = CGSize(width: -1, height: 1)
              layer.shadowRadius = 1
              layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
              layer.shouldRasterize = true
              layer.rasterizationScale = UIScreen.main.scale
          }
      }
      

      【讨论】:

      • 所有self. 都是不必要的。
      【解决方案3】:

      花了很多时间后,我才找到解决方案,只需添加这个简单的行。

      backgroundColor = .white

      希望对您有所帮助!

      【讨论】:

        【解决方案4】:
            func shadow(Vw : UIView)
            {
                Vw.layer.masksToBounds = false
                Vw.layer.shadowColor =  colorLiteral(red: 0.5058823529, green: 0.5333333333, blue: 0.6117647059, alpha: 1)
                Vw.layer.shadowOffset = CGSize(width: 0, height: 1)
                Vw.layer.shadowRadius = 5.0
                Vw.layer.shadowOpacity = 15.0
                Vw.layer.cornerRadius = 5.0
            }
        

        【讨论】:

          【解决方案5】:

          非常易于使用的 UIView 扩展,可直接从情节提要中进行编辑。斯威夫特 4+

          @IBDesignable extension UIView {
              @IBInspectable var shadowColor: UIColor?{
                  set {
                      guard let uiColor = newValue else { return }
                      layer.shadowColor = uiColor.cgColor
                  }
                  get{
                      guard let color = layer.shadowColor else { return nil }
                      return UIColor(cgColor: color)
                  }
              }
          
              @IBInspectable var shadowOpacity: Float{
                  set {
                      layer.shadowOpacity = newValue
                  }
                  get{
                      return layer.shadowOpacity
                  }
              }
          
              @IBInspectable var shadowOffset: CGSize{
                  set {
                      layer.shadowOffset = newValue
                  }
                  get{
                      return layer.shadowOffset
                  }
              }
          
              @IBInspectable var shadowRadius: CGFloat{
                  set {
                      layer.shadowRadius = newValue
                  }
                  get{
                      return layer.shadowRadius
                  }
              }
          }
          

          【讨论】:

            【解决方案6】:

            斯威夫特 5 只需调用此函数并传递您的视图

            public func setViewSettingWithBgShade(view: UIView)
            {
                view.layer.cornerRadius = 8
                view.layer.borderWidth = 1
                view.layer.borderColor = AppTextFieldBorderColor.cgColor
            
                //MARK:- Shade a view
                view.layer.shadowOpacity = 0.5
                view.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
                view.layer.shadowRadius = 3.0
                view.layer.shadowColor = UIColor.black.cgColor
                view.layer.masksToBounds = false
            }
            

            【讨论】:

              【解决方案7】:

              请试试这个,它对我有用。

              extension UIView {
              
              
              func dropShadow() {
              
                  layer.shadowColor = UIColor.black.cgColor
                  layer.shadowOffset = CGSize(width: 2, height: 3)
                  layer.masksToBounds = false
              
                  layer.shadowOpacity = 0.3
                  layer.shadowRadius = 3
                  //layer.shadowPath = UIBezierPath(rect: bounds).cgPath
                  layer.rasterizationScale = UIScreen.main.scale
                  layer.shouldRasterize = true
              }}
              

              【讨论】:

                【解决方案8】:

                我们也可以通过以下方式应用投影

                    cell.view1.layer.masksToBounds = false
                    cell.view1.layer.shadowColor = UIColor.lightGray.cgColor
                    cell.view1.backgroundColor = UIColor.white
                    cell.view1.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
                    cell.view1.layer.shadowOpacity = 0.5
                

                结果将是:http://prntscr.com/nhhv2s

                【讨论】:

                  【解决方案9】:

                  请试试这个

                  func applyShadowOnView(_ view: UIView) {
                      view.layer.cornerRadius = 8
                      view.layer.shadowColor = UIColor.darkGray.cgColor
                      view.layer.shadowOpacity = 1
                      view.layer.shadowOffset = .zero
                      view.layer.shadowRadius = 5
                  }
                  

                  【讨论】:

                    【解决方案10】:

                    在视图上应用阴影


                    func applyShadowOnView(_ view:UIView) {
                    
                            view.layer.cornerRadius = 8
                            view.layer.shadowColor = UIColor.darkGray.cgColor
                            view.layer.shadowOpacity = 1
                            view.layer.shadowOffset = CGSize.zero
                            view.layer.shadowRadius = 5
                    
                    }
                    

                    【讨论】:

                    • 如果不将 maskToBounds 设置为 false,这如何工作
                    【解决方案11】:

                    如果您需要圆形阴影。适用于 swift 4.2

                    extension UIView {
                    
                            func dropShadow() {
                    
                                var shadowLayer: CAShapeLayer!
                                let cornerRadius: CGFloat = 16.0
                                let fillColor: UIColor = .white
                    
                                if shadowLayer == nil {
                                    shadowLayer = CAShapeLayer()
                    
                                    shadowLayer.path = UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).cgPath
                                    shadowLayer.fillColor = fillColor.cgColor
                    
                                    shadowLayer.shadowColor = UIColor.black.cgColor
                                    shadowLayer.shadowPath = shadowLayer.path
                                    shadowLayer.shadowOffset = CGSize(width: -2.0, height: 2.0)
                                    shadowLayer.shadowOpacity = 0.8
                                    shadowLayer.shadowRadius = 2
                    
                                    layer.insertSublayer(shadowLayer, at: 0)
                                }
                            }
                        }
                    

                    Swift 4 rounded UIView with shadow

                    【讨论】:

                      【解决方案12】:

                      如果您想将其用作视图的 IBInspectable 属性,您可以添加此扩展

                      import UIKit
                      
                      extension UIView {
                      
                          private static var _addShadow:Bool = false
                      
                          @IBInspectable var addShadow:Bool {
                              get {
                                  return UIView._addShadow
                              }
                              set(newValue) {
                                  if(newValue == true){
                                      layer.masksToBounds = false
                                      layer.shadowColor = UIColor.black.cgColor
                                      layer.shadowOpacity = 0.075
                                      layer.shadowOffset = CGSize(width: 0, height: -3)
                                      layer.shadowRadius = 1
                      
                                      layer.shadowPath = UIBezierPath(rect: bounds).cgPath
                                      layer.shouldRasterize = true
                                      layer.rasterizationScale =  UIScreen.main.scale
                                  }
                              }
                          }
                      
                      }
                      

                      【讨论】:

                        【解决方案13】:

                        斯威夫特 4

                        toolbar.layer.shadowColor = UIColor.hex(hexColor: "#000000", withAlpha: 1.0).cgColor
                        toolbar.layer.shadowOffset = CGSize.zero
                        toolbar.layer.shadowRadius = 1
                        toolbar.layer.shadowOpacity = 1
                        toolbar.layer.shouldRasterize = true
                        toolbar.layer.masksToBounds = false
                        

                        【讨论】:

                          【解决方案14】:

                          代码片段:

                          extension UIView {
                          
                            // OUTPUT 1
                            func dropShadow(scale: Bool = true) {
                              layer.masksToBounds = false
                              layer.shadowColor = UIColor.black.cgColor
                              layer.shadowOpacity = 0.5
                              layer.shadowOffset = CGSize(width: -1, height: 1)
                              layer.shadowRadius = 1
                          
                              layer.shadowPath = UIBezierPath(rect: bounds).cgPath
                              layer.shouldRasterize = true
                              layer.rasterizationScale = scale ? UIScreen.main.scale : 1
                            }
                          
                            // OUTPUT 2
                            func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
                              layer.masksToBounds = false
                              layer.shadowColor = color.cgColor
                              layer.shadowOpacity = opacity
                              layer.shadowOffset = offSet
                              layer.shadowRadius = radius
                          
                              layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
                              layer.shouldRasterize = true
                              layer.rasterizationScale = scale ? UIScreen.main.scale : 1
                            }
                          }
                          

                          注意:如果您不将 any 参数传递给该函数,则 scale 参数默认为 true。您可以通过在参数类型之后为参数分配值来为函数中的任何参数定义默认值。如果定义了默认值,则可以在调用函数时省略该参数。

                          输出 1:

                          shadowView.dropShadow()
                          

                          输出 2:

                          shadowView.dropShadow(color: .red, opacity: 1, offSet: CGSize(width: -1, height: 1), radius: 3, scale: true)
                          

                          layer.shouldRasterize = true 将使阴影变为静态并为UIView 的初始状态产生阴影。所以我建议不要在动态布局中使用layer.shouldRasterize = true,例如UITableViewCell 内的视图。

                          【讨论】:

                          • 如果我想去掉这个阴影,我该怎么做?
                          • @SuhasPatil 如果你想删除阴影,为什么要首先添加它?您能否详细说明您的情况,以便我为您提供解决方案?
                          • 我们为什么要在这里栅格化?在我的视图中使用阴影在图像上创建像素化。
                          • 这里的某些东西使阴影获得静态大小,因此这对不同的设备不利
                          • 在 Swift 4.2 中为我工作,如果您想添加阴影,请执行以下操作:viewLoginCustom.dropShadow(color: yourColor, opacity: 1, offSet: CGSize.zero, radius: 3, scale: true )
                          【解决方案15】:

                          这对我有用(Swift 3 和 4)

                          yourView.layer.shadowColor = UIColor.gray.cgColor
                          yourView.layer.shadowOpacity = 0.3
                          yourView.layer.shadowOffset = CGSize.zero
                          yourView.layer.shadowRadius = 6
                          

                          【讨论】:

                          • 谢谢!如果您将第三行更改如下。对于第一次尝试的人来说,阴影更明显。 yourView.layer.shadowOffset = CGSize(width: 2, height: 2)
                          • 如果不将 maskToBounds 设置为 false,这将如何工作
                          【解决方案16】:
                          loginView.layer.shadowOpacity = 1.0
                          

                          【讨论】:

                            【解决方案17】:

                            非常简单,几行代码:

                            let viewShadow = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
                            viewShadow.center = self.view.center
                            viewShadow.backgroundColor = UIColor.yellow
                            viewShadow.layer.shadowColor = UIColor.red.cgColor
                            viewShadow.layer.shadowOpacity = 1
                            viewShadow.layer.shadowOffset = CGSize.zero
                            viewShadow.layer.shadowRadius = 5
                            self.view.addSubview(viewShadow)
                            

                            看起来像:

                            【讨论】:

                            • 如果不将 maskToBounds 设置为 false,这将如何工作
                            • @ShivamPokhriyal maskToBounds 默认为 false。
                            【解决方案18】:

                            虽然accepted answer 很棒并且可以正常工作,但我已对其进行了修改,将offSet: CGSize 拆分为offsetX: CGFloatoffsetY: CGFloat

                            extension UIView {
                              func dropShadow(offsetX: CGFloat, offsetY: CGFloat, color: UIColor, opacity: Float, radius: CGFloat, scale: Bool = true) {
                                layer.masksToBounds = false
                                layer.shadowOffset = CGSize(width: offsetX, height: offsetY)
                                layer.shadowColor = color.cgColor
                                layer.shadowOpacity = opacity
                                layer.shadowRadius = radius
                                layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
                                layer.shouldRasterize = true
                                layer.rasterizationScale = scale ? UIScreen.main.scale : 1
                              }
                            }
                            

                            【讨论】:

                              猜你喜欢
                              • 2023-03-16
                              • 1970-01-01
                              • 2015-10-23
                              • 2018-11-06
                              • 1970-01-01
                              • 2014-07-30
                              • 1970-01-01
                              • 2017-09-02
                              相关资源
                              最近更新 更多