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

标签 ios swift uibutton

需要你的一些知识 :)

我在没有使用 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/

相关文章:

objective-c - 如何将小图像嵌入到我的应用程序中?

objective-c - 如何在 iOS 中通过参数将 UITableView IndexPath 传递给 UIButton @selector?

swift - 在实例化 View Controller 中使用 NSMutableAttributedString 引用 UIButton 时出现问题

ios - 隐藏按钮上的状态栏点击 Swift 3/iOS 10

ios - firebase/存储/图像/ View

swift - Nested TabView - 移除内部标签栏 iOS 13、Swift UI

iphone - AudioQueue PropertyListener IsRunning 只回调一次

ios - 允许最后一个 UITableViewCell 滚动到第一行

ios - 如何在一行中声明变量和枚举声明?

ios - 从 Swift 中的特定线程运行代码