在无限 UIScrollView 中跨页面拖动视图

Posted

技术标签:

【中文标题】在无限 UIScrollView 中跨页面拖动视图【英文标题】:Dragging a view across pages in an infinite UIScrollView 【发布时间】:2016-11-02 10:32:16 【问题描述】:

我在无限滚动视图的子类中跨页面拖动视图时遇到了麻烦,因为一旦调用了viewWillLayoutSubviews 方法,视图就会卡在0,0 坐标处。这是全图:

我有一个UIScrollView(启用分页)的自定义子类,它保留一个索引,并且每次滚动它都会向它的数据源询问给定索引的新视图。它从[-1][0][1] 开始,用户只能看到[0]。一旦用户向右滚动,[-1] 将从超级视图中删除,[0][1] 移动并生成页面[2] 以提供[0][1][2]。这很完美,因为我将它用作无限滚动的日历。在这个日历中,我希望能够跨周拖动约会。这是使用UIGestureRecogniser 完成的 - 用户将约会视图保持 1 秒,这会触发UIGestureRecogniser,然后我使用[gesture locationInView:self] 来更新约会视图的位置。

当用户拖动到视图的一侧时,滚动条会移动以显示下一页。由于约会视图是它们所属页面的子视图,这意味着我需要将约会移动到滚动本身([scroll addSubview:appointmentView];),以保持UIGestureRecogniser 正常工作。但是,由于约会视图的原始位置是使用自动布局给出的,我不能用[appointmentView removeFromSuperview]; 删除父约束,因为它会停止UIGestureRecogniser,我必须循环遍历所有父约束并检查是否是firstItemsecondItem 等于 appointmentView。同样,这在原始页面中滚动时效果很好,尽管 appointmentView 现在是滚动的子视图而不是页面。

此时用户将appointmentView 拖到一边,我的滚动条会移动以显示下周(每个页面显示一周)。然而这一次,appointmentView briefly 瞬间移动到(0,0),但UIGestureRecogniser 仍在工作,所以如果我继续移动手指,appointmentView 将返回在屏幕上移动。此时,假设appointmentView来自第0页,它的页面在左边,居中的页面是第1页-[0][1][2]

最后问题来了:如果用户再向右移动一周,appointmentView 的原始页面(第 0 页)将被移除,因为滚动现在显示[1][2][3],并且约会视图跳转到(0,0)滚动和UIGestureRecogniser 立即终止,而不通过其状态为UIGestureRecogniserStateEnded 的选择器运行。

我 99.9% 确定没有剩余的父母限制将 appointmentView 链接到其原始父页面 0,这意味着我不知道为什么删除页面 0 会导致这种行为。 appointmentView 仅对其自身(宽度和高度)及其子视图(视图内的标签)有约束,这意味着布局视图不应影响 appointmentView 的位置;然而……

到目前为止我的想法:

    我知道,如果我创建一个全新的appointmentView 并将其直接添加到滚动条中,这样它就没有指向一周页面的链接,它会正常运行而不会出现任何问题。这意味着如果有办法以编程方式触发UIGestureRecogniser,我可以简单地执行以下操作。当用户按住appointmentView 一秒钟时,我可以删除旧的appointmentView,创建一个新的并将其添加到相同的位置,触发它的UIGestureRecogniser,然后只需按照用户的手指使用新的appointmentView .但是,如果用户不将手指从屏幕上移开,我看不到这样做的方法。 也许我仍然以某种方式忘记了一些导致appointmentView 在其原始父级被删除时发疯的父级约束,但我不明白这怎么可能。它只有 4 个约束条件: x 坐标基于页面宽度的分数和约会日期; y坐标基于页面高度的分数和约会的开始时间;宽度作为页面宽度的一部分;高度作为页面高度的一部分。我清楚地删除了所有这 4 个,我将 translatesAutoresizingMaskIntoConstraints 设置为 false 放弃,在角落里哭泣

对此的任何意见将不胜感激。

【问题讨论】:

【参考方案1】:

我设法解决了这个问题,在释放原始父视图时出现了问题,所以我只是在整个移动过程中将它保存在一个变量中,并在拖动完成后释放它。

【讨论】:

以上是关于在无限 UIScrollView 中跨页面拖动视图的主要内容,如果未能解决你的问题,请参考以下文章

使用重复的结束页面的无限 UIScrollView

在 UIScrollView 中拖动 UIButtons?

拖动子视图时防止 UIScrollView 滚动

使用三个视图的无限循环分页 UIScrollView

在 UIScrollView 中拖动一个 UIView

将两个 UIScrollView 连接在一起