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

需要你的一些伟大的知识:)

我写了一个UIButton( CustomWideButton.swift )的子类而不使用UIButton对象。 我这样做是因为它对于我需要创build的buttontypes更加灵活。

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

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

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

我将在控制台中看到“我突出显示”,但是它不会调用animateHighlight(),除非我稍微开始在button上滑动手指。 如果我这样做,那么animateHighlight()的作品。

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

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

我很抱歉,如果自定义button代码看起来过度,这是因为我从我的项目中部分提取它,我们正在使用MVVM。

在此先感谢您的帮助!

您的debugging信息会误导您。 我把你的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状态非常迅速地(0.13秒)在设置为true之后回到假。 你有期待吗?

3) animateHighlight是越野车,并没有产生任何明显的变化。 如果仔细追踪代码,则会在更新标签的文本后看到setupUI() 。 这是因为你从layoutSubviews()调用了setupUI() layoutSubviews()layoutSubviews在运行期间一直被调用当一个视图的任何变化可能会影响子视图setupUI应该只在视图添加到它的 setupUI 视图时被调用,例如在viewDidLoad()

滑动工作的原因是layoutSubviews() 延迟,直到完成滑动,因为它是触发tap操作的.touchUpInside事件,但是被隐藏的UIButton触发.touchDownInside处理!