如何在 UIScrollView 的“反弹”区域中绘制?

Posted

技术标签:

【中文标题】如何在 UIScrollView 的“反弹”区域中绘制?【英文标题】:How can I draw in the "bounce" area of a UIScrollView? 【发布时间】:2011-04-21 15:28:32 【问题描述】:

我有一个自定义绘制的视图,它包含在一个水平滚动的 UIScrollView 中。该视图使用水平延伸的线条和一些不同的背景颜色绘制背景。当我滚动到最左侧以使滚动视图“反弹”时,我看到灰色背景色。我想做的是在该区域中绘制额外的背景线和颜色,以便看起来视图永远持续下去,但我无法弄清楚如何做到这一点。我已经尝试将所有视图的 clipsToBounds 设置为 NO,并在视图外的区域进行绘图,但这似乎不起作用。我如何在这个区域画画?

【问题讨论】:

您是否尝试过创建自己的滚动视图(UIScrollView 子类)并实现 drawRect:?将其与原始绘图实现结合起来可能会很棘手,但这是我首先尝试的方式。 【参考方案1】:

至少在我的情况下,我找到了解决方案。我只是用额外的边距增加了滚动视图的大小,然后将滚动视图部分定位在屏幕之外。

    CGFloat scrollViewHeight = 300;
    CGFloat preferredWidthOfContent = 500;
    CGFloat gutterMargin = self.bounds.size.width / 2;
    scrollView.frame = CGRectMake(-1 * gutterMargin, 0, self.bounds.size.width, scrollViewHeight)
    scrollView.contentSize = CGSizeMake(preferredWidthOfContent + 2 * gutterMargin, scrollViewHeight);
    contentView.frame = CGRectMake(0, 0, preferredWidthOfContent + 2 * gutterMargin, scrollViewHeight);

内容视图必须知道装订线边距宽度,然后根据它在正确的位置绘制实际内容。当 scrollView 被“反弹”时,实际上显示的是内容视图的其余部分。

这个技巧很有效,因为滚动视图正在延伸到屏幕之外。如果您想对不接触屏幕边缘的滚动视图使用相同的技巧,您只需将另一个视图放在滚动视图的顶部以隐藏额外的空间。

【讨论】:

【参考方案2】:

如果您在drawRect: 方法中绘制线条,则无法将它们绘制到视图边界之外。 clipsToBounds 属性只影响子视图,因此,理论上,您可以将一个子视图添加到您的 主视图(显示内容的视图),其框架延伸到您的视图右侧并绘制该子视图中的行。

另一种选择是将子视图添加到滚动视图,并将其放置在主视图的右侧。然后在这个子视图中画线。滚动视图仍然会反弹,因为它并不关心其中是否还有部分可见的视图,它只查看contentSize 属性来决定何时停止滚动。

如果两个选项都不合适,请更详细地描述您正在绘制什么样的线条以及您想要实现什么样的外观。

【讨论】:

以上是关于如何在 UIScrollView 的“反弹”区域中绘制?的主要内容,如果未能解决你的问题,请参考以下文章

限制UIScrollView中的可滚动区域

UIScrollView 在内容小于视图大小时反弹

对于 UIScrollview,我如何使用自己的 panGestureRecognizer 但允许 scrollView 使用其识别器进行反弹?

UIScrollView 内的 UIVIew 反弹回来

UIScrollView 仅在底部禁用垂直反弹

UIScrollView 不反弹