Прокрутка в UIScrollView без запуска touchCancelled

Обзор

Я работаю над игрой для iPhone, код которой унаследовал от другого разработчика. Игровая сетка - это UIScrollView, имеющий размер содержимого 1000x1000. Сетка содержит несколько элементов, нарисованных на экране с помощью класса OpenGL Texture2D.

UIScrollView прокручивает в направлении, противоположном тому, в котором движется ваш палец. Идея состоит в том, чтобы имитировать «просеивание» элементов пальцем, поскольку предполагается, что на каждый элемент на пути вашего прикосновения воздействуют / манипулируют.

Проблема

Проблема заключается в том, что прокрутка триггеров UIScrollView вызывает touchesCancelled, тем самым завершая вызовы touchesMoved, на которые полагается игра, чтобы узнать, какими элементами манипулировать. Даже если мои пальцы не двигаются t визуально запускать просмотр для прокрутки, перемещение моего пальца на расстояние более 10 пикселей запускает метод touchesCancelled, тем самым завершая будущие вызовы touchesMoved, пока я не подниму палец и не начну новое событие касания.

Я уверен, что событие прокрутки запускает метод touchesCancelled, потому что, если я установил self.scrollingEnabled = NO; в представлении, перемещение пальца по экрану продолжит запускать touchesMoved, когда он независимо от того, как далеко я перемещаю палец по экрану, touchesEnded вызывается, как и ожидалось, когда я поднимаю палец (после того, как я закончил просеивать элементы), и каждый элемент на пути моего касания / смахивания действительно обрабатывается как желанный. Однако установка этого свойства естественным образом предотвращает желаемую прокрутку игровой сетки.

Неудачные попытки исправить

Я попытался установить self.canCancelContentTouches = NO; в методе initWithFrame представления, но касаетсяCancelled ], как ни странно, все еще срабатывает. Не уверен, почему это так! Может быть, я ошибся его местом, но я не уверен, что это могло бы стать решением моей проблемы, потому что документы подразумевают, что такой параметр все равно предотвратит прокрутку: «Если значение этого свойства НЕТ, представление прокрутки не прокручивается независимо от движения пальца после того, как представление содержимого начинает отслеживание. " Ясно, что это не то поведение, которое мне нужно, так что это свойство, похоже, не то, что меня интересует после все. Хотя я' m все еще недоумевает, почему он по-прежнему прокручивается и вызывает touchesCancelled , но я отвлекся.

Я также добавил метод - (BOOL) touchesShouldCancelInContentView: (UIView *) view , но он не вызывается, даже без установки self.canCancelContentTouches = NO; , поскольку в документации говорится, что установка для свойства canCancelTouches значения NO действительно предотвратит вызов метода touchesShouldCancelInContentView: «Представление прокрутки не вызывает этот метод, если значение свойства canCancelContentTouches равно NO.» . Хотя в документации неясно, будет ли возвращение NO из этого метода также предотвращать прокрутку, как, например, установка canCancelContentTouches = NO; . Если не, тогда это должно быть идеальным решением. Опять же, я понятия не имею, почему этот метод даже не вызывается, поскольку в документах упоминается только одно свойство / параметр, который предотвращает его вызов, и он все еще не был вызван, даже если для этого свойства не установлено значение NO (таким образом, по умолчанию ДА).

Куда мне идти дальше?

Так что теперь я в растерянности. Дело в том, что мне все еще нужно touchMoved, чтобы продолжать вызывать после начала прокрутки представления. Это вообще возможно? Если нет, то какие у меня здесь варианты?

10
задан purefusion 10 March 2011 в 15:02
поделиться