需要你的一些知识 :)
我在没有使用 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。
预先感谢您的帮助!
最佳答案
您的调试消息误导了您。我将你的 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 秒)切换回 false。你预料到了吗?
3) animateHighlight
有问题并且不会产生任何可见的变化。如果仔细跟踪代码,您会看到在更新标签文本后立即调用了 setupUI()
。这是因为您正在从 layoutSubviews()
调用 setupUI()
。 layoutSubviews
在运行时的所有时间当 View 发生任何变化可能影响 subview 时被调用。 setupUI
应该被调用 只有当 View 被添加到它的父 View 时,例如在 viewDidLoad()
滑动起作用的原因是 layoutSubviews()
被延迟直到您完成滑动,因为它是 .touchUpInside
事件触发点击 Action ,但是 isHighlighted
是由隐藏的 UIButton
.touchDownInside
处理触发的!
关于ios - UIButton: 当isHighlighted = true时,我只能通过滑动手指来调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45910739/