我在视图中有一个滚动视图。在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()"试图"重绘"再次按下所有按钮,但永远不会被调用。
你们知道某种方法吗?
答案 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。