UIButton:当isHighlighted = true时,我只能通过滑动手指来调用函数

时间:2017-08-28 01:24:31

标签: ios swift uibutton

需要你的一些知识:)

我在不使用UIButton对象的情况下编写了UIButton的子类( CustomWideButton.swift )。我这样做是因为它对于我需要创建的按钮类型更灵活。

有一件奇怪的事情,我不知道这是不是正常行为。

点击正常的按钮区域时会调用 var isHighlighted 。所以,如果我写这样的东西:

var isHighlighted {
    didSet {
      print("I am Highlighted")
      animateHighlight()
    }
}

我将在控制台中看到“我被突出显示”,但它不会调用 animateHighlight(),除非我稍微开始在按钮上滑动手指。如果我这样做,那么 animateHighlight()就可以了。

我在BitBucket上发布了一个示例项目,因此您更容易理解我面临的问题: https://bitbucket.org/stephaneDepoilly/stackohighlightedbutton

zip的直接链接:https://bitbucket.org/stephaneDepoilly/stackohighlightedbutton/get/ee4fc398f475.zip

如果自定义按钮代码看起来有些过分,我很抱歉,这是因为我从项目中部分提取了它并且我们正在使用MVVM。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您的调试信息会误导您。我将您的print替换为:

 NSLog("isHighlighted on \(title) set to \(isHighlighted)")

我添加了animateHighlight()中的第一行:

 NSLog("animateHighlight enter: triggered by isHighlighted on \(title) set to \(isHighlighted)")

我得到了:

2017-08-27 21:57:34.870 StackO_HighlightFunctionCall isHighlighted on [...LOGIN...] set to true
2017-08-27 21:57:34.871 StackO_HighlightFunctionCall animateHighlight enter: triggered by isHighlighted on [...LOGIN...] set to true
2017-08-27 21:57:35.000 StackO_HighlightFunctionCall isHighlighted on [...LOGIN...] set to false
2017-08-27 21:57:35.000 StackO_HighlightFunctionCall animateHighlight enter: triggered by isHighlighted on [...LOGIN...] set to false

所以:

1)animateHighlight确实在你告诉它被调用时被调用。使用DebuggerForce!

2)isHighlighted状态在设置为true后非常快速地(0.13秒)切换回假。你有没有期待?

3)animateHighlight是错误的,不会产生任何明显的变化。如果仔细浏览代码,您会在更新标签文本后立即看到setupUI()被调用。这是因为您从setupUI()致电layoutSubviews()。当有关视图的任何内容更改可能会影响子视图时,layoutSubviews会在运行时中一​​直调用setupUI只有在将视图添加到其超级视图时才会被调用,例如在viewDidLoad()

滑动的原因是layoutSubviews() 延迟,直到您完成滑动,因为.touchUpInside事件会触发点按操作,但是isHighlighted由隐藏的UIButton .touchDownInside处理触发!