如何在不将 UIScrollView 的 delaysContentTouches 设置为 NO 的情况下快速点击它时使 UIScrollView 中的按钮突出显示

Posted

技术标签:

【中文标题】如何在不将 UIScrollView 的 delaysContentTouches 设置为 NO 的情况下快速点击它时使 UIScrollView 中的按钮突出显示【英文标题】:How to make button in UIScrollView highlight when tapping on it quickly without setting UIScrollView's delaysContentTouches to NO 【发布时间】:2014-02-13 22:13:25 【问题描述】:

如果你只是在 UIScrollView 中放置一个 UIButton,当你快速点击它时,该按钮不会突出显示。相反,您必须在按钮突出显示之前点击并按住一段时间。根据文档,这是因为 UIScrollView 在将触摸转发到滚动视图中的视图之前会稍等片刻来确定用户是否打算拖动滚动视图。

正如 *** 的几个答案(例如这个:https://***.com/a/19656611/2135004)中所述,解决方案是通过将 UIScrollView 的 delaysContentTouches 属性设置为 NO 来防止这种延迟。 (另外一个步骤是继承 UIScrollView 以覆盖 touchesShouldCancelInContentView:为 UIButtons 返回 YES,因此如果用户最初触摸滚动视图中的按钮,用户仍然可以滚动滚动视图。)

但是,与 App Store 应用交互似乎提出了另一种解决方案。 (虽然它可能有点挑剔,但我不使用 delaysContentTouches 设置为 NO 的解决方案的一个原因是,如果用户快速拖动按钮以滚动滚动视图,我不希望按钮突出显示。这是实际上是突出显示行为 UITableViewCells。)考虑以下 App Store 应用的屏幕截图:

蓝色的“快速链接”按钮(即“App Collections”、“Game Collections”和“Apps Made by Apple”)似乎是作为 UIButtonTypeSystem 样式的 UIButtons 实现的,因为它们的突出显示会随着您的出现而淡入淡出将手指拖入和拖出它们。此外,滚动视图的 delaysContentTouches 属性似乎没有设置为 NO,因为当您快速点击蓝色的“快速链接”按钮时,它们不会突出显示。但是,当您快速点击灰色边框按钮(即“兑换”、“发送礼物”和“Apple ID:...”)时,它们会突出显示! (当您将手指拖入和拖出它们时,它们的突出显示也会淡入淡出。)另请注意,当您在拖动滚动视图时碰巧触摸它们时,这些按钮不会突出显示。

这些灰色边框按钮是如何实现的?我想要的关键行为是,当您在延迟内容触摸的滚动视图中快速点击它们时它们会突出显示。(当您像普通 UIButtons 一样将手指拖入和拖出时,它们也应该突出显示和取消突出显示,最好通过淡化它们的突出显示。)我不知道如何通过子类化 UIButton 轻松实现这一点,我什至不确定是否可以通过某种方式子类化 UIControl 来创建新的按钮类。

【问题讨论】:

【参考方案1】:

我认为这里发生的情况是灰色按钮的突出显示状态在其动作触发时设置,然后在显示结果警报或工作表时取消设置。

(如果您没有显示警报或工作表,您只需安排它在下一个运行循环中不突出显示。)

【讨论】:

我试过了。您的解决方案很接近。实际上,您必须在动作触发后设置 NEXT 运行循环上的突出显示状态,而不是在动作触发时。然后你可以在之后的下一个运行循环中取消突出显示它,正如你所说的。当您在释放按钮之前按住按钮一会儿时,它甚至似乎不会干扰突出显示的淡出。任何想法为什么它适用于这种边缘情况? 没有想法。通常这些单运行循环调整实际上只是为了迎合实现细节,所以一定要尽早针对未来的 ios 版本进行测试!

以上是关于如何在不将 UIScrollView 的 delaysContentTouches 设置为 NO 的情况下快速点击它时使 UIScrollView 中的按钮突出显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在不将文件写入光盘的情况下创建文件并压缩它们?

如何在不将鉴别器传递给构造函数的情况下映射 Enumeration 类?

如何在不将道具传递给底层 DOM 元素的情况下扩展样式组件?

如何在不将 nib 名称指定为字符串的情况下使用 nib 加载 View Controller 子类?

如何在不将目录包含到彼此编译命令中的情况下构建目标?

如何在不将空值发送到输出数组的情况下拆分字符串