首页 > 解决方案 > 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 以检查它们是否被按下,但我真的不知道语法是怎样的......

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

提前致谢 !

标签: swiftbutton

解决方案


定义 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()
            }
        }
    }

不要在此之后添加 view.layoutIfNeeded()


推荐阅读