2017-08-23 37 views
3

我想創建一個UIButton子類,並從顏色選擇和禁用狀態的背景圖像。該UIButton的將是帶有圓角邊緣self.layer.cornerRadius = self.frame.height/2從不同狀態的顏色的UIButton背景圖像

class RoundedButton: UIButton { 

public var shadowOffset: CGSize = CGSize(width:0, height:0) { 
    didSet{ 
     self.layer.shadowOffset = shadowOffset 
    } 
} 

public var shadowRadius: CGFloat = 0.0 { 
    didSet{ 
     self.layer.shadowRadius = shadowRadius 
    } 
} 

public var shadowOpacity: Float = 1.0 { 
    didSet{ 
     self.layer.shadowOpacity = shadowOpacity 
    } 
} 

public var shadowColor: UIColor = UIColor.black { 
    didSet{ 
     self.layer.shadowColor = shadowColor.cgColor 
    } 
} 

public var selectedBackgroundColor: UIColor = UIColor.black 

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.layer.cornerRadius = self.frame.height/2 

    self.setBackgroundImage(getImageWithColor(color: selectedBackgroundColor, size: self.frame.size, cornerRadius: self.frame.height/2), for: .selected) 
} 

func getImageWithColor(color: UIColor, size: CGSize, cornerRadius: CGFloat?) -> UIImage? { 
    let rect = CGRect(x:0, y:0, width:size.width, height:size.height) 
    UIGraphicsBeginImageContextWithOptions(size, false, 0) 
    color.setFill() 

    if cornerRadius != nil { 
     UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius!).addClip() 
    } 

    UIRectFill(rect) 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image 
} 

} 

當我選擇按鈕(我做更改狀態時,該按鈕被點擊)的怪異認爲該按鈕只檢測第一次在它不工作竊聽。另一個奇怪的行爲是,如果我分配一個正常的UIImage(不是由核心圖形創建的),它的工作原理可能會產生錯誤的圖像。

請注意,我需要結合陰影,圓角半徑和能夠從UIColor具有不同的背景按鈕狀態顏色。

回答

1

你沒有爲其他狀態設置背景圖像:.normal,.disabled在你的情況下。您也不需要在layoutSubviews函數中設置圖像。只需重寫初始化程序併爲其中的所有狀態設置背景圖像。

另類可以觀察isSelected,isHighlighted等,只需設置您的按鈕的backgroundColor屬性。