2016-11-02 11 views
0

У меня проблемы с перетаскиванием представлений на страницах в подклассе моего бесконечного вида прокрутки, как только вызывается метод viewWillLayoutSubviews, представление застревает в 0,0 координатах. Вот полная картина:Перетаскивание представления через страницы в бесконечном UIScrollView

У меня есть собственный подкласс 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 «s исходная страница (страница 0) получает удален, как свиток теперь показывает [1][2][3] и appointmentView перескакивает на (0,0) свитка и UIGestureRecogniser немедленно прекращается без пробега через его селектор с состоянием UIGestureRecogniserStateEnded.

Я 99.9% уверен, что нет оставшихся родительских ограничений, связывающих appointmentView с исходной родительской страницей 0, что означает, что я понятия не имею, почему удаление страницы 0 вызывает подобное поведение. У appointmentView есть только ограничения на себя (ширина и высота) и на его подзонах (метки в представлении), что означает, что выкладка представлений не должна влиять на местоположение appointmentView; и все же ...

Мои идей до сих пор:

  1. Я знаю, что если я создаю новую бренд appointmentView и добавить его непосредственно к свитку так это не имеет никакого отношения к недельным странице, он ведет себя правильно без каких-либо проблем. Это означает, что если есть способ вызвать программный код UIGestureRecogniser, я мог бы просто сделать следующее.Когда пользователь держит appointmentView на секунду, я могу удалить старый appointmentView, создать новый и добавить его в том же месте, вызвать его UIGestureRecogniser, а затем просто следовать пальцем пользователя с помощью нового appointmentView. Тем не менее, я не вижу способа сделать это без того, чтобы пользователь поднял палец с экрана.
  2. Возможно, я все-таки забыл о некотором родительском ограничении, из-за чего appointmentView сходит с ума, когда его исходный родитель удален, но я не вижу, как это возможно. Он имеет только 4 ограничения: x координата, основанная на доле ширины страницы и в день, когда назначается встреча; y в зависимости от доли высоты страницы и времени начала назначения; ширина как часть ширины страницы; высота как часть высоты страницы. Я ясно удалить все 4 из них, и у меня есть translatesAutoresizingMaskIntoConstraints набор к ложному
  3. Откажитесь и плакать в углу

Любой вход на это будет невероятно ценится.

ответ

0

Мне удалось решить эту проблему, возникла проблема, когда исходное родительское представление было выпущено, поэтому я просто сохранил его в переменной во время процесса перемещения и освободил его после завершения перетаскивания.