Swift:当按下按钮时更改按钮样式并重设其他按钮

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift:当按下按钮时更改按钮样式并重设其他按钮相关的知识,希望对你有一定的参考价值。

所以我有这些按钮(3个堆栈,每个6个,所以18个),而我想要实现的是当我按下这些按钮之一时:

  • 边框颜色和文本颜色的更改

  • 其他按钮均已重置为正常样式

但是我不想通过“ isEnabled”技巧来禁用其他功能(我只在这里找到涉及isEnabled的解决方案),我仍然希望启用它们,我只是不想让它们被我的“突出显示”按下一个时的自定义样式。

对于样式的第一部分,我是在IBAction中完成的:

        @IBAction func preset1Pressed(_ sender: UIButton) {
        preset1.layer.borderColor = #colorLiteral(red: 0.4095217415, green: 0.6107917746, blue: 0.2774988226, alpha: 1)
        preset1.layer.borderWidth = 0.42
        preset1.setTitleColor(#colorLiteral(red: 0.4095217415, green: 0.6107917746, blue: 0.2774988226, alpha: 1), for: .normal)
        }

这小部分仅用于1个按钮,但是我想如果我有18个按钮,我应该制作一个类或结构,而不是在每个IBAction中复制它?还是功能?

然后,对于第二部分,我不确定该怎么做,当按下一个按钮时,会恢复为其他按钮的原始属性(在“属性”检查器中设置)。直观地讲,我确定这是一个函数中所有18个按钮的数组的组合,该函数将循环遍历所有数组,并且可能会对每个按钮进行bool检查它们是否被按下,但是我真的不知道知道语法将如何...

值得一提的是,如果我在同一个按钮上按两次,我不希望它恢复其原始属性,而是保持“被按下”的样式。

提前感谢!

答案

定义UIButton数组并在将其添加到stack.set索引中作为按钮标签(0-17)时添加按钮

fileprivate var btnArray:[UIButton] = []

btn0.tag = 0
btnArray.appent(btn0)

然后您就可以像这样在按钮单击功能中更改样式

    @IBAction func preset1Pressed(_ sender: UIButton) {

       btnArray.forEach { (button) in
            if button.tag == sender.tag {
                preset1.layer.borderColor = #colorLiteral(red: 0.4095217415, green: 0.6107917746, blue: 0.2774988226, alpha: 1)
                preset1.layer.borderWidth = 0.42
                preset1.setTitleColor(#colorLiteral(red: 0.4095217415, green: 0.6107917746, blue: 0.2774988226, alpha: 1), for: .normal)
                view.layoutIfNeeded()
            }else{
                //add default style
                view.layoutIfNeeded()
            }
        }
    }

此后不要frogot添加view.layoutIfNeeded()

另一答案

所以建议Dilan不能完全自己解决它,尽管我进行了试验,但实际上我做了些修改,但实际上它帮助我解决了问题:

我创建了我的按钮数组(称为预置数组)并标记了它们。然后,我创建了一个在所有IBAction中都要调用的函数,但是由于sender.tag无法正常工作,因此这是我设计该函数的方式:

func styleButtons(tag: Int) {
        let tag = tag
        presetsArray.forEach{ (button) in
            if button.tag == tag {
                button.layer.borderColor = #colorLiteral(red: 0.4095217415, green: 0.6107917746, blue: 0.2774988226, alpha: 1)
                button.layer.borderWidth = 0.42
                button.setTitleColor(#colorLiteral(red: 0.4095217415, green: 0.6107917746, blue: 0.2774988226, alpha: 1), for: .normal)
                view.layoutIfNeeded()
            } else {
                button.layer.borderColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
                button.setTitleColor(#colorLiteral(red: 0.4978774786, green: 0.5020093918, blue: 0.5019439459, alpha: 1), for: .normal)
            }
        }
    } 

然后在每个X的IBAction中,我这样称呼它:

styleButtons(tag: presetX.tag)

在我函数的其他部分中,view.layoutIfNeeded()不会退回到我的原始样式,我只是去了颜色选择器并选择了原始样式,这不是我感觉到的最合法的方法,但是它可以工作!

非常感谢Dilan的帮助。

以上是关于Swift:当按下按钮时更改按钮样式并重设其他按钮的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 中的属性检查器列表更改条形按钮图像

Mat-icon:当按下一个按钮时,所有的图标都会改变

iOS当按下按钮“下一步”加载新行表单解析Swift

按下取消按钮时如何重设标记视图的位置?

如何在按下另一个按钮之前更改按钮状态?

按下按钮时 UITableView 标题视图的动画显示(swift)