UIButton:当isT突出显示=true时,我只能通过滑动手指来调用函数



需要一些你丰富的知识:)

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

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

var is突出显示在点击按钮区域时调用,这是正常的。所以如果我写这样的东西:

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

我会在控制台中看到"我被突出显示",但它不会调用animateHighlight(),除非我稍微开始在按钮上滑动手指。如果我这样做,那么动画高亮()工作。

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

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

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

提前感谢您的帮助!

您的调试消息会误导您。我用以下方式替换了您的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确实被召唤了。使用调试器强制!

2)isHighlighted状态在设置为true后非常迅速地(0.13 秒)切换回 false。你期待吗?

3)animateHighlight是有缺陷的,不会产生任何可见的变化。如果您仔细跟踪代码,您将看到setupUI()在更新标签的文本后立即被调用。这是因为您从layoutSubviews()调用setupUI()layoutSubviews运行时,当有关视图的任何内容发生更改可能会影响子视图时,都会一直被调用。仅当视图添加到其超级视图时,才应调用setupUI,例如在viewDidLoad()

轻扫起作用的原因是layoutSubviews()会延迟到您完成轻扫,因为触发点击操作的是.touchUpInside事件,但isHighlighted是由隐藏的UIButton.touchDownInside处理触发的!

最新更新