在无限UIScrollView

时间:2016-11-02 10:32:17

标签: ios objective-c uiscrollview uigesturerecognizer

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

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

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

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

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

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

到目前为止我的想法:

  1. 我知道如果我创建一个全新的appointmentView并将其直接添加到滚动中,因此它没有指向周页面的链接,它的行为正常而没有任何问题。这意味着如果有办法以编程方式触发UIGestureRecogniser,我可以简单地执行以下操作。当用户暂时停留appointmentView时,我可以删除旧版appointmentView,创建一个新版本并将其添加到同一位置,触发其UIGestureRecogniser,然后只需关注用户&# 39;用新appointmentView的手指。但是,如果没有用户将手指从屏幕上抬起,我就看不到这样做的方法。
  2. 也许我仍然在某种程度上忘记了一些父约束导致appointmentView在删除其原始父母时发疯但我不知道这是怎么可能的。它只有4个约束:x坐标基于页面宽度的分数和约会的日期; y坐标基于页面高度的分数和约会的开始时间;宽度作为页面宽度的一部分;高度作为页面高度的一部分。我清楚地删除了所有这4个,我将translatesAutoresizingMaskIntoConstraints设置为false
  3. 在角落里放弃并哭泣
  4. 对此的任何意见都会非常感激。

1 个答案:

答案 0 :(得分:0)

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