在 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 将文本保存到实例/全局变量

更改在 UITableview 中按下的特定按钮的图像

如何在nib文件中按下时禁用UIButton高亮显示?

在自定义 UITableViewCell 中按下 UIButton 时如何获取 indexPathForSelectedRow

如何将自定义 UIControl 中按下的 UIButton 传递给我的视图控制器?