2016-12-27 36 views
1

我創建圓形按鈕如下:斯威夫特 - 應用陰影圓形按鈕上點擊

class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
      let button = GradientButton.createCircularButton(20, yPos: 20, width: 30, height: 30, circleValue:20) 

     button.addTarget(self, action: #selector(ViewController.didCircleBtnTouched(_:)), forControlEvents: UIControlEvents.TouchUpInside) 
     self.view.addSubview(button) 
    } 
} 


enum ColorType { 
    case red, green, orange 
} 

class GradientButton: UIButton { 
    var colorType: ColorType? 


public class func createCircularButton(xPos: CGFloat, yPos: CGFloat, width: CGFloat, height: CGFloat, circleValue: Int) -> GradientButton { 
    let button = GradientButton() 

    button.titleLabel!.font = UIFont(name:"HelveticaNeue", size: 12) 
    let buttonFrame = CGRect(x: xPos, y: yPos, width: width, height: height) 

    button.frame = buttonFrame 

    button.backgroundColor = UIColor.clearColor() 
    button.backgroundColor = UIColor.whiteColor() 


    button.layer.borderWidth = 1 
    button.layer.cornerRadius = 15.0 
    //this helps making it circular not rectangle 
    button.clipsToBounds = true 


    let red = UIColor(red:134/255, green:16/255, blue:1/255, alpha:1.0)//red 
    let green = UIColor(red:0/255, green:136/255, blue:43/255, alpha:1.0)//green 
    let orange = UIColor(red:243/255, green:144/255, blue:25/255, alpha:1.0)//orange 

    if(circleValue <= 3){ 
     button.colorType = .green 
     button.layer.borderColor = UIColor.greenColor().CGColor 
     button.setTitleColor(green, forState: .Normal) 
    } else if(circleValue > 3 && circleValue <= 7){ 
     button.colorType = .orange 
     button.layer.borderColor = UIColor.orangeColor().CGColor 
     button.setTitleColor(orange, forState: .Normal) 
    } else if(circleValue > 7){ 
     button.colorType = .red 
     button.layer.borderColor = UIColor.redColor().CGColor 
     button.setTitleColor(red, forState: .Normal) 

    }  
    button.setTitle("\(circleValue)", forState: .Normal) 
    return button 
} 
} 

而且按鈕的點擊我申請梯度如下:

func didCircleBtnTouched(sender:GradientButton!){ 
      ApplyGradientToButton(sender) 
} 



func ApplyGradientToButton(sender: GradientButton!){ 
    var color1 = UIColor() 
    var color2 = UIColor() 

    if(sender.colorType == .red){ 
     color1 = UIColor(red:134/255, green:16/255, blue:1/255, alpha:1.0) 
     color2 = UIColor(red:200/255, green:37/255, blue:6/255, alpha:1.0) 
    } 
    else if(sender.colorType == .green) { 
     color1 = UIColor(red:0/255, green:136/255, blue:43/255, alpha:1.0) 
     color2 = UIColor(red:112/255, green:191/255, blue:65/255, alpha:1.0) 
    } 
    else if(sender.colorType == .orange) { 
     color1 = UIColor(red:200/255, green:110/255, blue:1/255, alpha:1.0) 
     color2 = UIColor(red:239/255, green:149/255, blue:26/255, alpha:1.0) 

    } 

    sender.setTitleColor(UIColor.whiteColor(), forState: .Normal) 

    var layer = sender.layer 

    layer.shadowColor = UIColor.blackColor().CGColor 
    layer.shadowOffset = CGSize(width: 0.0, height: 5.0) 
    layer.shadowOpacity = 1.0 
    layer.shadowRadius = 10.0 


    sender.applyGradient([color2, color1], locations: [0.0, 0.90]) 
} 

我需要顯示單擊按鈕上的圓形按鈕上的陰影。但影子沒有得到顯示。 我認爲button.clipsToBounds = true是負責任的,因爲當我不使用此屬性時出現陰影。不幸的是,通過刪除此屬性,我的圓形按鈕在點擊後變爲矩形,這是不可取的

有什麼方法可以在不改變按鈕形狀的情況下顯示陰影嗎? 請指教?

電流輸出:

Current

預期輸出:

Expected

回答

0

只是把viewController.swift文件的代碼。(或任何其他文件)

extension UIView { 
    func setRadiusWithShadow(_ radius: CGFloat? = nil) { 
     self.layer.cornerRadius = radius ?? self.frame.width/2 
     self.layer.shadowColor = UIColor.darkGray.cgColor 
     self.layer.shadowOffset = CGSize(width: 1.5, height: 1.5) 
     self.layer.shadowRadius = 1.0 
     self.layer.shadowOpacity = 0.7 
     self.layer.masksToBounds = false 
    } 

} 

,然後應用到您的按鈕..

btnEdit.setRadiusWithShadow() 

是啊...剛纔看到的輸出...一切都做...

注:您可以更改CGSize(寬度: 1.5,身高:1.5)值根據您的需要...