以编程方式滚动时在 UIScrollView 上显示滚动指示器

Posted

技术标签:

【中文标题】以编程方式滚动时在 UIScrollView 上显示滚动指示器【英文标题】:Showing scroll indicators on a UIScrollView when programmatically scrolling 【发布时间】:2012-10-12 16:02:41 【问题描述】:

编辑:这个问题的症结在于滚动指示器在程序化滚动期间不显示,但我希望它们显示。我最初的问题(在下面提供)假设这与userInteractionEnabled 有关,但事实并非如此。提到主 UIScrollView 和从属 UIScrollView 也可能会分散我的核心问题(在编程滚动期间需要显示滚动指示器)。向那些根据我的误导性假设/信息回答或评论的人道歉。

可能的解决方案:我发现这样做的唯一方法是使用滚动指示器是 UIImageView 的实例这一事实,并使用其上的类别来破解 alpha。这个article 展示了这种方法。然后是使用标签和滚动视图委托方法在程序化滚动之前永久打开 alpha 并在滚动完成时永久关闭的情况。不过这感觉很hacky,所以欢迎任何进一步的建议!

此行以下的所有内容都是原始未经编辑的问题,用于为用户的答案和 cmets 提供上下文

UIScrollView 对象中的userInteractionEnabled 设置为NO 似乎会在程序滚动时禁用滚动指示器。即使您有self.showsVerticalScrollIndicator = self.showsHorizontalScrollIndicator = YES;

,也会发生这种情况

有没有办法以编程方式滚动滚动视图但仍显示指示器?

(提供一些上下文:我有一个从属滚动视图,它通过连接滚动视图委托回调并将内容偏移量传递给从属滚动视图来模仿主滚动视图。但是,我不希望用户能够直接操作从属滚动视图,但我确实想要滚动指示器)。

【问题讨论】:

你为什么会有这种奇怪的设置? (如果很明显,请道歉!) 因为在我的应用程序中,我想要一个跟随主滚动视图的从滚动视图,但不能直接与之交互。我觉得奇怪的是,Apple 在这种情况下会自动禁用滚动指示器——仅仅因为用户不能与之交互并不意味着它不能以编程方式滚动。 截图/模型,好吗?我发现很难理解为什么会出现这种行为......:/ 在滚动时调用 [scrollView flashScrollIndicators] 会发生什么? 嗨@Tim,我尝试了在程序化滚动期间调用flashScrollIndicators 的方法,但问题是滚动指示器可能在滚动完成动画之前很久就消失了。在滚动过程中连续调用flashScrollIndicators 也不好,因为这会导致滚动指示器闪烁。 【参考方案1】:

尝试将 UIScrollView 的 scrollEnabled 属性设置为 false,而不是将 userInteractionEnabled 设置为 false。医生。说“禁用滚动时,滚动视图不接受触摸事件”,这应该意味着您仍然应该能够以编程方式滚动 UIScrollView。希望这会有所帮助 - 没有测试过请告诉我。

【讨论】:

【参考方案2】:

您可以尝试在滚动视图上放置一个透明的 UIView (alpha == 0.0)(但作为视图层次结构中的同级,而不是作为子视图)。在透明视图上将 touchesEnabled 设置为 YES,它将拦截指向滚动视图的触摸。

【讨论】:

以上是关于以编程方式滚动时在 UIScrollView 上显示滚动指示器的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 以编程方式滚动到底部

以编程方式将触摸传递给 UIScrollView 以进行滚动

以编程方式取消用户滚动 UIScrollView

如何以编程方式使用 UIScrollView 使 UIStackView 滚动?

以编程方式将 UIScrollView 滚动到 Swift 中的子 UIView(子视图)的顶部

以编程方式在 UITableViewCell 内创建 UIScrollView - ScrollView 不滚动