swift - 单击按钮时我需要删除内部阴影

标签 swift uibutton shadow

这是我的扩展,用于将内部阴影添加到按钮中。 我创建了所有我希望我的阴影进入按钮或 View 的情况。

public extension UIView

{ //不同的内阴影样式 公共(public)枚举innerShadowSide { 全部情况、左、右、顶部、底部、顶部和左、顶部和右、底部和左、底部和右、除了左、除了右、除了顶部、除了底部 }

// define function to add inner shadow
public func addInnerShadow(onSide: innerShadowSide, shadowColor: UIColor, shadowSize: CGFloat, cornerRadius: CGFloat = 0.0, shadowOpacity: Float) -> CAShapeLayer

{
    // define and set a shaow layer
    let shadowLayer = CAShapeLayer()
    shadowLayer.frame = bounds
    shadowLayer.shadowColor = shadowColor.cgColor
    shadowLayer.shadowOffset = CGSize(width: 0.0, height: 0.0)
    shadowLayer.shadowOpacity = shadowOpacity
    shadowLayer.shadowRadius = shadowSize
    shadowLayer.fillRule = kCAFillRuleEvenOdd

    // define shadow path
    let shadowPath = CGMutablePath()

    // define outer rectangle to restrict drawing area
    let insetRect = bounds.insetBy(dx: -shadowSize * 2.0, dy: -shadowSize * 2.0)

    // define inner rectangle for mask
    let innerFrame: CGRect = { () -> CGRect in
        switch onSide
        {

        case .all:
            return CGRect(x: 0.0, y: 0.0, width: frame.size.width, height: frame.size.height)
        case .left:
            return CGRect(x: 0.0, y: -shadowSize * 2.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 4.0)
        case .right:
            return CGRect(x: -shadowSize * 2.0, y: -shadowSize * 2.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 4.0)
        case .top:
            return CGRect(x: -shadowSize * 2.0, y: 0.0, width: frame.size.width + shadowSize * 4.0, height: frame.size.height + shadowSize * 2.0)
        case.bottom:
            return CGRect(x: -shadowSize * 2.0, y: -shadowSize * 2.0, width: frame.size.width + shadowSize * 4.0, height: frame.size.height + shadowSize * 2.0)
        case .topAndLeft:
            return CGRect(x: 0.0, y: 0.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 2.0)
        case .topAndRight:
            return CGRect(x: -shadowSize * 2.0, y: 0.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 2.0)
        case .bottomAndLeft:
            return CGRect(x: 0.0, y: -shadowSize * 2.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 2.0)
        case .bottomAndRight:
            return CGRect(x: -shadowSize * 2.0, y: -shadowSize * 2.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 2.0)
        case .exceptLeft:
            return CGRect(x: -shadowSize * 2.0, y: 0.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height)
        case .exceptRight:
            return CGRect(x: 0.0, y: 0.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height)
        case .exceptTop:
            return CGRect(x: 0.0, y: -shadowSize * 2.0, width: frame.size.width, height: frame.size.height + shadowSize * 2.0)
        case .exceptBottom:
            return CGRect(x: 0.0, y: 0.0, width: frame.size.width, height: frame.size.height + shadowSize * 2.0)
        }
    }()

    // add outer and inner rectangle to shadow path
    shadowPath.addRect(insetRect)
    shadowPath.addRect(innerFrame)

    // set shadow path as show layer's
    shadowLayer.path = shadowPath

    // add shadow layer as a sublayer
    layer.addSublayer(shadowLayer)

    // hide outside drawing area
    clipsToBounds = true

    return shadowLayer

}

} 当我第一次看到我的按钮时,我使用这样的代码: 在本例中,我希望所有按钮都有阴影,并且我使用黑色。

var shadowLayer : CAShapeLayer?

            self.shadowLayer = okButton.addInnerShadow(onSide: UIView.innerShadowSide.all, shadowColor: UIColor.black, shadowSize: 10.0, shadowOpacity: 10.0)

当我单击按钮进入我的函数时,我需要删除这个内部阴影:

       @IBAction func btnAction(_ sender: DLRadioButton) {
    if sender.tag == 1
    {
        statoBici = "ok"
        print(statoBici)
        setConfermaButton()
        self.shadowLayer.removeFromSuperLayer()


    }

最佳答案

修改您的 UIView 函数以返回 CAShapeLayer:

public func addInnerShadow(onSide: innerShadowSide, shadowColor: UIColor, shadowSize: CGFloat, cornerRadius: CGFloat = 0.0, shadowOpacity: Float) -> CAShapeLayer
{
.
.
. 
  return shadowLayer
}

然后向您的类添加变量或成员变量:

class ViewController: UIViewController {
  var shadowLayer : CAShapeLayer!



 override func viewDidLoad() {
    super.viewDidLoad()  
    self.shadowLayer = btnShadow.addInnerShadow(onSide: UIView.innerShadowSide.all, shadowColor: UIColor.black, shadowSize: 10.0, shadowOpacity: 10.0)
  }
}

最后,从按钮中删除阴影层:

  @IBAction func btnAction(_ sender: Any) {
        if let btn = sender as? UIButton
        {
          if btn.tag == 1 {
            self.shadowLayer.removeFromSuperlayer()
          }
        }
      }

enter image description here enter image description here

关于swift - 单击按钮时我需要删除内部阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50958186/

相关文章:

ios - 如何在 Swift 中安全地解压选项(AlamoFire 响应对象)

iOS rxSwift : retryWhen updating refresh token

swift - 如何在 Swift 的自定义类中创建 UIButton 操作

ios - 在 UIView 外绘制阴影

ios - 更改任何 swift 代码后 Umbrella 头文件未更新

swift - 当我按 + 或 - (Swift5) 时,计算器无法清除标签?

ios - UIbutton 标题上的自定义字体剪裁在单词顶部

swift - 我的 UIButton 没有调用目标方法

html - 如何为 div 的顶部和底部制作 CSS 阴影?

ios - 如何向圆形 UIImageView 或 UIView 添加阴影?