У меня проблемы с перетаскиванием представлений на страницах в подклассе моего бесконечного вида прокрутки, как только вызывается метод 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
; и все же ...
Мои идей до сих пор:
- Я знаю, что если я создаю новую бренд
appointmentView
и добавить его непосредственно к свитку так это не имеет никакого отношения к недельным странице, он ведет себя правильно без каких-либо проблем. Это означает, что если есть способ вызвать программный кодUIGestureRecogniser
, я мог бы просто сделать следующее.Когда пользователь держитappointmentView
на секунду, я могу удалить старыйappointmentView
, создать новый и добавить его в том же месте, вызвать егоUIGestureRecogniser
, а затем просто следовать пальцем пользователя с помощью новогоappointmentView
. Тем не менее, я не вижу способа сделать это без того, чтобы пользователь поднял палец с экрана. - Возможно, я все-таки забыл о некотором родительском ограничении, из-за чего
appointmentView
сходит с ума, когда его исходный родитель удален, но я не вижу, как это возможно. Он имеет только 4 ограничения: x координата, основанная на доле ширины страницы и в день, когда назначается встреча; y в зависимости от доли высоты страницы и времени начала назначения; ширина как часть ширины страницы; высота как часть высоты страницы. Я ясно удалить все 4 из них, и у меня естьtranslatesAutoresizingMaskIntoConstraints
набор к ложному - Откажитесь и плакать в углу
Любой вход на это будет невероятно ценится.