滚动时如何将 UIScrollView 子视图“粘贴”到顶部/底部?

Posted

技术标签:

【中文标题】滚动时如何将 UIScrollView 子视图“粘贴”到顶部/底部?【英文标题】:How to "stick" a UIScrollView subview to top/bottom when scrolling? 【发布时间】:2011-07-21 00:25:16 【问题描述】:

您可以在 Gilt 等 iPhone 应用程序中看到这一点。用户滚动一个视图,并且一个子视图显然“粘”在一个边缘,因为其余的 scrollView 在下面滑动。也就是说,scrollView 中有一个文本框(或其他),当 scrollView 到达视图的顶部时,当视图的其余部分继续滑动时“粘”在那里。

所以,有几个问题。首先,可以通过“scrollViewDidScroll:”(在正常滚动期间)确定感兴趣的视图何时通过(或重新出现)。这里有相当多的粒度 - 委托调用之间的差异可能是一百点或更多。也就是说,当您看到视图接近 scrollView 顶部时,您会打开静态显示在 scrollView 顶部下方的视图的第二个副本。我没有对此进行编码,但它似乎缺乏真正的“棒”外观 - 视图将首先消失然后重新出现。

其次,如果执行 setContentOffset:animated,则不会获得委托消息(Gilt 不会这样做)。那么,在这种情况下如何获得回调呢?你在 "scroll.layer.presentationLayer.bounds" 上使用 KVO 吗?

【问题讨论】:

【参考方案1】:

嗯,我找到了一种方法来做到这一点。当用户通过轻弹和拖动滚动时,UIScrollView 会为其委托提供“scrollViewDidScroll:”消息。然后,您可以查看滚动条是否已将内容移动到您需要执行某些操作的位置。

当“粘贴”视图时,将其从scrollView中移除,然后将其添加到scrollView的superview中(原点为0,0)。不粘时,反之。

如果你使用 UIScrollView setContentOffset:animated:,它会变得更棘手。我所做的是继承 UIScrollView,使用一个标志来指定它是 setContentOffset 移动偏移量,然后启动一个快速运行的计时器来监视 contentOffset。

我将处理数学和粘贴/取消粘贴子视图的方法放入这个子类中。看起来还不错。

【讨论】:

【参考方案2】:

Gilt 使用表格视图来完成此操作。具体来说,在table view的delegate中,这两个方法:

– tableView:viewForHeaderInSection: 和– tableView:heightForHeaderInSection:

【讨论】:

正确,但这仅适用于单个部分。在我的情况下,公司想要一个带有购买按钮的视图,卡在某个任意单元格中,以“粘贴”。不可能使用部分来完成此操作。但是,我并没有像原来的问题那样清楚。

以上是关于滚动时如何将 UIScrollView 子视图“粘贴”到顶部/底部?的主要内容,如果未能解决你的问题,请参考以下文章

将 UIButtons 添加为子视图时 UIScrollView 不滚动

如何将 UITableviewcell 子视图添加为 uiscrollview

UIScrollView 如何将充当容器的子视图约束到所有其他视图?

如何将 UIPanGestureRecognizer 添加到 UIScrollView 子视图

如何阻止 UIScrollView 吞下触摸

缩放时,UIScrollview 子视图无法识别手势