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

Posted

技术标签:

【中文标题】UIButton:当isHighlighted = true时,我只能通过滑动手指来调用函数【英文标题】:UIButton: when isHighlighted = true, I can only call a function by swiping my finger 【发布时间】:2017-08-28 01:24:30 【问题描述】:

需要你的一些知识:)

我编写了 UIButton 的子类 (CustomWideButton.swift),但没有使用 UIButton 对象。我这样做是因为它对于我需要创建的按钮类型更加灵活。

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

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。

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

您的调试信息误导了您。我将您的 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 在运行时一直被调用,当有关视图的任何更改可能影响子视图时。 setupUI 应该被调用只有当视图被添加到它的父视图时,例如在viewDidLoad()

滑动有效的原因是layoutSubviews()延迟直到您完成滑动,因为触发点击动作的是.touchUpInside 事件,但isHighlighted 由隐藏的@987654339 触发@.touchDownInside处理!

【讨论】:

非常感谢 BaseZen 的分析!我删除了 animateHighlight() 的 else 条件,因为它会在 isHighlight = false 时恢复到原来的状态。我现在更好地理解了这张照片。我的问题已经解决了。

以上是关于UIButton:当isHighlighted = true时,我只能通过滑动手指来调用函数的主要内容,如果未能解决你的问题,请参考以下文章

为 UIButton isHighlighted 属性设置 Observable

单击时如何防止按钮动画

Swift中的Objective C Setter覆盖

在依赖属性 WPF 上使用绑定时出现问题 [重复]

通过在多个按钮上滑动手指来选择多个按钮

当用户与 UIButton 交互时,是不是可以让我在自定义 UIButton 的 drawRect 中绘制的内容“变暗”?