如何动态更改自定义 UIButton 图像
Posted
技术标签:
【中文标题】如何动态更改自定义 UIButton 图像【英文标题】:How to change custom UIButton's image on fly 【发布时间】:2018-12-11 18:32:00 【问题描述】:我创建了一个自定义 UIButton 类,使其看起来像下拉选择。我在按钮右侧有一个小的向下箭头图像。我想根据各种条件将按钮的图像更改为不同的图像,例如灰色、白色或红色。怎么做?以下是我的代码:
class DropDownButton: UIButton
let dropDownImageGrey = UIImage(named: "Icons/DropDown/Grey")
let dropDownImageWhite = UIImage(named: "Icons/DropDown/White")
let dropDownImageRed = UIImage(named: "Icons/DropDown/Red")
override init(frame: CGRect)
super.init(frame: frame)
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
override func awakeFromNib()
super.awakeFromNib()
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: self.frame.width - 108, bottom: 0, right:0)
self.setImage(dropDownImageGrey, for: [])
self.titleEdgeInsets = UIEdgeInsets(top: 0, left: -13, bottom: 0, right:0)
override func viewDidLoad()
// Change image to red one
dropDownButton.??? // How to change?
【问题讨论】:
dropDownButton.setImage(dropDownButton.dropDownImageRed, for: .normal)
?但是你最好使用静态常量。
Tx,你的意思是图像常量吗,这些 => let dropDownImageGrey = UIImage(named: "Icons/DropDown/Grey") ?
【参考方案1】:
您可能想使用UIButton
的setImage
属性,
override func viewDidLoad()
// Change image to red one
let dropDownButton = DropDownButton()
dropDownButton.setImage(dropDownButton.dropDownImageRed, for: .normal)
如果图片是在Assets.xcassets
中添加的,那么你可以使用image literals
或者直接使用类似的名字,
let dropDownImageGrey = UIImage(named: "Grey")
let dropDownImageWhite = UIImage(named: "White")
let dropDownImageRed = UIImage(named: "Red")
【讨论】:
【参考方案2】:我认为上面的一些答案有效。但是,为了生产代码,我建议使用 enum 作为图像列表。
class DropDownButton: UIButton
enum ImageType: String
case grey = "Icons/DropDown/Grey"
case white = "Icons/DropDown/White"
case red = "Icons/DropDown/Red"
var image: UIImage? return UIImage(named: rawValue)
var imageType: ImageType = .red
didSet
setImage(imageType.image, for: .normal)
override init(frame: CGRect)
super.init(frame: frame)
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
override func awakeFromNib()
super.awakeFromNib()
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: self.frame.width - 108, bottom: 0, right:0)
self.titleEdgeInsets = UIEdgeInsets(top: 0, left: -13, bottom: 0, right:0)
override func viewDidLoad()
// Change image to red one
dropDownButton.imageType = .red
以后如果需要更改图片类型,只需设置按钮的imageType即可。喜欢
dropDownButton.imageType = .grey
dropDownButton.imageType = .white
【讨论】:
有趣的想法。【参考方案3】:您可以使用枚举来定义各种条件并添加获取图像的方法。根据条件,您可以设置图像。示例如下:
在你的类之外定义这个枚举
enum DropdownCondition
case condition1
case condition2
case condition3
func getImage() -> UIImage?
switch self
case .condition1:
return UIImage(named: "Icons/DropDown/Grey")
case .condition1:
return UIImage(named: "Icons/DropDown/White")
case .condition1:
return UIImage(named: "Icons/DropDown/Red")
default:
return nil
在您的 viewDidLoad/init 或任何基于条件调用 yourMethodWithSomeoCndition(.condition1) 的方法中。
override func viewDidLoad()
// Change image to red one
let dropDownButton = DropDownButton()
//Call based on your condition
yourMethodWithSomeoCndition(.condition1)//This condition can change on the fly
func yourMethodWithSomeoCndition(_ condition:DropdownCondition)
self.dropDownButton.setImage(condition.getImage(), for: .normal)
【讨论】:
以上是关于如何动态更改自定义 UIButton 图像的主要内容,如果未能解决你的问题,请参考以下文章
使用 UIButton 自定义 UITableViewCell:无法更改 UIImage
如何在点击时更改作为自定义 UICollectionViewCell 属性的 UIButton 的 UIImage?
如何在 cellforrowatindexpath 之后更新自定义表格单元格中的 UIButton 图像?