UIButton的奇怪状态变化(UIControlState)

Posted

技术标签:

【中文标题】UIButton的奇怪状态变化(UIControlState)【英文标题】:Strange state change(UIControlState) of UIButton 【发布时间】:2017-11-20 04:32:11 【问题描述】:

在理解UIControlState 的概念时,我得到了一个奇怪的UIButton 结果。这是我与UIButton相关的简单代码。

import UIKit

class ViewController: UIViewController 

    let normalBtn: UIButton = 
        let button = UIButton()

        button.frame = CGRect(x: 80, y: 200, width: 200, height: 100)

        button.setTitle("????", for: .normal)
        button.setTitle("????", for: .highlighted)
        button.setTitle("????", for: .selected)
        button.setTitle("????", for: .focused)

        button.titleLabel?.font = UIFont.systemFont(ofSize: 50)

        return button
    ()

    override func viewDidLoad() 
        super.viewDidLoad()

        view.addSubview(normalBtn)

        normalBtn.addTarget(self, action: #selector(btnSelected), for: .touchUpInside)

    

    @objc func btnSelected() 
        print("highlight", normalBtn.isHighlighted)

        normalBtn.isSelected = !normalBtn.isSelected
    


这是我关于这段代码的场景。

    当我触摸normalBtn 时,此按钮的状态将normal 更改为 selected。 当我再次触摸normalBtn 时,它的状态从 selectednormal。 当我触摸normalBtn 时,highlighted 属性也应该更改。

所以我改变标题的期望是

    ???? -> ????触摸时 -> ????(normalselected) ???? -> ????触摸时 -> ????(selectednormal)

但结果是,

    ???? -> ????触摸时 -> ????(normalselected) ???? -> ??????(selectednormal

我真的不知道为什么。关于这个问题的任何想法?谢谢。

【问题讨论】:

据我所知,突出显示的状态不会来自 Selected 到正常转换。反之亦然。可能是取消突出显示 @SivajeeBattina 那么,有没有办法像normalBtn.isDeHighlighted 那样捕捉到取消突出显示的点? 我期待这个问题。但是没有捕捉到去突出显示。 @SivajeeBattina 在btnSelected()print("highlight", normalBtn.isHighlighted) 的内部总是打印true。这种现象是否与去高亮有关? 【参考方案1】:

尝试添加选中状态并结合高亮状态。

例子:

button.setTitle("?", for: UIControlState.selected.union(.highlighted))

【讨论】:

正如@sivajee 所说:“突出显示的状态不会来自 Selected 到正常转换”,因此苹果提供了将状态组合在一起的方法,就像您的情况一样。并且由于突出显示状态出现在选定/正常状态之前,因此您的情况令人满意。 :) 感谢您的解释!现在我知道如何使用它了。 我的荣幸。 :)【参考方案2】:

已接受答案的替代语法:

button.setTitle("?", for: [.selected, .highlighted])

【讨论】:

以上是关于UIButton的奇怪状态变化(UIControlState)的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UIControl/UIButton 动画从一种状态到另一种状态的过渡? [复制]

UIControl 中的控件状态如何工作?

具有所有实例的全局状态的自定义 UIControl 元素

带有 UIControl/UIButton 子视图的 ScrollView/TableView 在 iOS 8 下不可滚动

如何将自定义 UIControl 中按下的 UIButton 传递给我的视图控制器?

UIButton 上的 UIControl.State.Highlighted 图像仅在第一次触摸事件后有效