需要你的一些知识:)
我在不使用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。
提前感谢您的帮助!
答案 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
处理触发!