需要一些你丰富的知识:)
我在不使用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
处理触发的!