UIbutton 仅在 longPress 上看起来被点击(突出显示)?

Posted

技术标签:

【中文标题】UIbutton 仅在 longPress 上看起来被点击(突出显示)?【英文标题】:UIbutton only looks clicked (highlighted) on longPress? 【发布时间】:2016-12-29 00:10:03 【问题描述】:

这似乎是一个有点奇怪的问题。我在 tableView 中的迭代 tableViewCell 中有一个 UIButton,它被放置在常规 ViewController 中。出于某种原因,它在长按时看起来只是被点击(从默认的蓝色突出显示为浅蓝色,然后又回到蓝色)。它会在常规点击时执行我分配给它的任何操作(刚刚从普通的旧打印语句开始),但只是没有 look 点击。有人知道如何解决这个问题吗? 按钮处于正常状态:

点击后的按钮:

长按后的按钮(对不起,不得不用手机拍照)

编辑:这与 ios7 问题中的答案不同,因为我正在寻找 iOS 10 快速解决方案,而不是 Objective-c。 iOS7也没有

【问题讨论】:

您可以添加屏幕截图或 gif 以显示发生了什么吗?我不能从你的描述中看出发生了什么。 @Jadar ,我已经发布了相关图片。正常状态和单击按钮后的外观完全相同。只有长按才会高亮(变亮),松开后又恢复到正常状态颜色 UIButton not showing highlight on tap in iOS7的可能重复 @Jadar 我看了一下那个问题,但找不到解决方案。这是iOS10,我是用swift编程,而不是objective-c 该答案可转换为 Swift 并且确实回答了这个问题。唯一的问题是使用私有类并将表格视图修改为提交,这绝不是一个好主意。 【参考方案1】:

这是正常行为。这是由于 UIScrollView 的 delaysContentTouches 属性。根据 Apple 的docs:

如果这个属性的值为YES,滚动视图延迟处理 触摸向下手势,直到它可以确定滚动是否是 意图。如果值为 NO ,则滚动视图立即调用 touchesShouldBegin:withEvent:inContentView:.

编辑: This answer 给出了以下解决方案。我已经测试过了,它确实有效。但是,由于它正在施展魔法,我不建议您实际执行此操作,因为当 Apple 决定在幕后更改其视图层次结构时,它不可避免地会中断。

tableView.delaysContentTouches = false
for case let x as UIScrollView in tableView.subviews 
    x.delaysContentTouches = false

旧答案: This answer 提供了一个解决方案,但它确实是一个 hack,并且可能会导致您的应用由于使用私有类而被 Apple 拒绝。由于该行为确实是一项功能,因此我建议您保持原样。

【讨论】:

我不确定这是否有意义;按钮动作被立即调用,它只是不会发生的突出显示。如果它本质上是在等待应用程序确定它是否滚动,为什么立即调用该操作?此外,在tableViewController 中(这个问题的场景是tableView 放入ViewController),这不会发生。没有延迟,可以看到一个按钮立即按下。 奇怪的是action被处理了但是UI被延迟了。但是,当我测试时,我使用 UITableViewController 进行了测试,并且确实看到了延迟。 所以我认为这与 UITableView 使用的不同 UIScrollViews 有关。不管它是如何创建的。 好的,我想试试这个。这个代码块在哪里? cellForRowAt IndexPath? 没关系,我明白了。但是当他们改变视图层次结构时会发生什么?就没有解决办法吗?

以上是关于UIbutton 仅在 longPress 上看起来被点击(突出显示)?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView、UIMenuController 和 LongPress 手势

UIButton上的长按手势识别器?

UIButton 仅在 UIControlStateNormal 上设置图像

LongPress on List 确实在 iPad 上重新排序,但如何在 iPhone 上重新排序

UIButton - 仅在没有待处理事件时调用 Release?

UIButton - 仅在一个方向上可拉伸的背景图像?