在 Swift 中按下 uibutton 时更改色调图像颜色
Posted
技术标签:
【中文标题】在 Swift 中按下 uibutton 时更改色调图像颜色【英文标题】:Change tint image color when pressing uibutton in Swift 【发布时间】:2016-01-14 21:38:48 【问题描述】:我在视图中有一个滚动视图。在滚动视图中,我以编程方式创建了 5 个按钮。每个按钮加载一个不同的图像,每个图像都有不同的标签。我添加了一个在按下按钮时调用的函数。
let avatarsListScrollingView = avatarsListView(CGSizeMake(70.0, 55.0), avatarCount: 5)
func avatarsListView(buttonSize:CGSize, avatarCount:Int) -> UIView
**CODE**
for i in 0...(avatarCount-1)
let button = UIButton(type: .Custom)
**CODE**
button.setImage(UIImage(named: avatarsList[i]), forState: .Normal)
button.tag = i
button.addTarget(self, action: "avatarListSelected:", forControlEvents: .TouchUpInside)
avatarButtonView.addSubview(button)
return avatarButtonView
然后当按下按钮时,我调用“avatarListSelected”:
func avatarListSelected(sender:UIButton)
if let image = sender.imageView?.image?.imageWithRenderingMode(.AlwaysTemplate)
sender.setImage(image, forState: .Normal)
sender.tintColor = UIColor.redColor()
self.addAvatarView.reloadInputViews()
此功能将图像按钮着色为红色,它工作正常,但问题是当我按下其他按钮时,我希望另一个按钮变为原始颜色。现在我按下的每个按钮都会变成红色。
我尝试将调用添加到“self.addAvatarView.reloadInputViews()”以尝试再次“重绘”所有按钮,但从未被调用。
你们知道一些方法吗?
【问题讨论】:
【参考方案1】:谢谢大家! 这是解决问题的最终代码:
func avatarListSelected(sender:UIButton)
print(sender.tag)
if let image = sender.imageView?.image?.imageWithRenderingMode(.AlwaysTemplate)
sender.setImage(image, forState: .Normal)
sender.tintColor = UIColor.redColor()
for view in self.avatarButtonView.subviews as [UIView]
if let btn = view as? UIButton
if btn.tag != sender.tag
btn.setImage(UIImage(named: avatarsList[btn.tag]), forState: .Normal)
【讨论】:
【参考方案2】:创建属性selectedButton: UIButton?
并在此处保留对所选按钮的引用。不要忘记在avatarListSelected
方法中更新它,在你改变它之前,如果它不是nil,把它的颜色改成原来的(然后再改变它)。
如果按钮有不同的原始颜色,则继承UIButton
类并保留原始颜色。
【讨论】:
【参考方案3】:我不知道是否有更好的方法或答案,但是,我也许可以使用这种方法来实现:
创建一个方法,为您的选择按钮“填充”颜色并为其他按钮“清除”颜色,但它是一个循环通过 UIScrollView 并查找每个 UIButton 的方法。像这样:
func setBackgroundColorButton(color:UIColor , buttonTag:Int)
for view in self.scrollView.subviews as [UIView]
if let btn = view as? UIButton
if btn == buttonTag
btn.tintColor = color
else
btn.tintColor = UIColor.whiteColor()
这是概念,我没有测试,但可能只需要调整以在您的滚动视图或类似视图中搜索。
但我相信这样会很好用:D
【讨论】:
感谢费利佩!你的回答很有帮助。我已经发布了最终代码【参考方案4】:你可以这样做
for i in 0...5
let button = UIButton(type: .Custom)
let x = 50 * i + 10
let y = 50
button.frame = CGRectMake(CGFloat(x), CGFloat(y), 40, 40)
button.setTitle("\(i)", forState: .Normal)
button.tag = i
button.backgroundColor = UIColor.greenColor()
button.tintColor = UIColor.blueColor()
button.addTarget(self, action: "avatarListSelected:", forControlEvents: .TouchUpInside)
self.view.addSubview(button)
func avatarListSelected(sender : UIButton)
sender.backgroundColor = UIColor.orangeColor()
for view in self.view.subviews
if(view.isKindOfClass(UIButton))
let button = view as! UIButton
if button.tag != sender.tag
button.backgroundColor = UIColor.greenColor()
框架等仅用于演示目的,您当然应该使用自己的价值。 tintColor
属性并非对所有按钮类型都有效。阅读documentation了解更多信息。
【讨论】:
以上是关于在 Swift 中按下 uibutton 时更改色调图像颜色的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中按任意键更改自定义 UIButton 的 BG 颜色
按下 UIButton 时,Swift 将文本保存到实例/全局变量
在自定义 UITableViewCell 中按下 UIButton 时如何获取 indexPathForSelectedRow