在无限 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
,我必须循环遍历所有父约束并检查是否是firstItem
或secondItem
等于 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 中跨页面拖动视图的主要内容,如果未能解决你的问题,请参考以下文章