【问题标题】:Swift : change style of a button when pressed and reset other buttonsSwift:按下时更改按钮的样式并重置其他按钮
【发布时间】:2020-07-17 03:39:27
【问题描述】:

所以我有这些按钮(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 以检查它们是否被按下,但我真的不知道语法是怎样的......

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

提前致谢!

【问题讨论】:

    标签: swift button


    【解决方案1】:

    定义 UIButton 数组并在将其添加到 stack.set index 作为按钮标记 (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()

    【讨论】:

    • 嘿Dilan,谢谢你的回答,但它不起作用......它只是做和我之前做的一样的事情,这意味着我点击的按钮的样式,但如果我点击3个按钮它们仍然使用我的自定义内容进行样式设置,即使使用 view.layoutIdNeeded(),其他属性也不会被反转为其原始属性。另外,如果我必须在每个按钮的每个 IBAction 中执行这么长的代码部分,那不是浪费代码行吗?有没有办法让它成为我在每个 IBAction 中调用的函数,而不是每次都有这么长的代码部分?谢谢
    【解决方案2】:

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

    我创建了我的按钮数组(称为 presetsArray)并标记了它们。 然后我创建了一个要在所有 IBActions 中调用的函数,但是由于 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)
    

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

    非常感谢迪兰的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 2019-02-24
      相关资源
      最近更新 更多