在Swift中按uibutton时更改色调图像颜色

时间:2016-01-14 21:38:48

标签: ios swift xcode uiscrollview uibutton

我在视图中有一个滚动视图。在scrollview中,我以编程方式创建了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()"试图"重绘"再次按下所有按钮,但永远不会被调用。

你们知道某种方法吗?

4 个答案:

答案 0 :(得分:3)

感谢大家! 这是解决问题的最终代码:

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)
            }
        }
    }
}

答案 1 :(得分:1)

创建一个属性selectedButton: UIButton?并在那里保留对所选按钮的引用。不要忘记在avatarListSelected方法中更新它,在更改之前,如果它不是零,则将其颜色更改为原始颜色(然后更改它)。 如果按钮具有不同的原始颜色,则子类UIButton类并保留原始颜色。

答案 2 :(得分:1)

我不知道是否有更好的方法或答案,但是,我可能会使用这种方法来实现这一目标:

创建一个方法,为所选按钮“填充”颜色并为其他人“清除”颜色,但它是一个循环通过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

答案 3 :(得分:1)

你可以这样做

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