繁体   English   中英

Swift:按下时更改按钮的样式并重置其他按钮

[英]Swift : change style of a button when pressed and reset other buttons

所以我有这些按钮(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 个按钮,我应该制作一个 class 或结构,而不是在每个 IBAction 中复制它? 还是函数?

然后对于第二部分,我不知道该怎么做,当按下一个按钮时,返回到其他按钮的原始属性(在属性检查器中设置)。 直观地说,我确信它是 function 中所有 18 个按钮的数组的组合,它将遍历所有数组,并且可能在每个按钮上创建一个布尔值以检查它们是否被按下,但我真的没有知道语法是怎样的......

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

提前致谢 !

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

fileprivate var btnArray:[UIButton] = []

btn0.tag = 0
btnArray.appent(btn0)

然后你可以改变按钮点击 function 像这样

    @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()

所以建议 Dilan 自己并没有完全解决它,尽管我尝试了它并且它实际上帮助我解决了它,除了我做了这些修改:

我创建了我的按钮数组(称为 presetsArray)并标记了它们。 然后我创建了一个 function 以在所有 IBActions 中调用,但是由于 sender.tag 不起作用,这就是我计算出 function 的方法:

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

然后在预设 XI 的每个 IBAction 中都会这样调用它:

styleButtons(tag: presetX.tag)

在我的 function 的 else 部分中,因为 view.layoutIfNeeded() 不会恢复到我原来的样式,我只是选择了颜色选择器并选择了我原来的样式,这不是我觉得最合法的方法,但它有效!

非常感谢迪兰的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM