我正在尝试创建一个UIButton
子类,并从颜色中选择和禁用状态背景图像。 UIButton将采用圆边self.layer.cornerRadius = self.frame.height/2
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获得不同的背景按钮状态颜色。
答案 0 :(得分:1)
您没有为其他状态设置背景图片:.normal,.disabled在您的情况下。您也不需要在layoutSubviews
函数中设置图像。只需覆盖初始化程序并为其中的所有状态设置背景图像。
备选方案,您可以观察isSelected
,isHighlighted
等,只需设置按钮的backgroundColor
属性即可。