Обзор
Я работаю над игрой для iPhone, код которой я унаследовал от другого разработчика.Игровая сетка представляет собой UIScrollView, имеющий размер содержимого 1000x1000.Сетка содержит несколько элементов, нарисованных на экране с помощью класса OpenGL Texture2D.
UIScrollView прокручивается в направлении, противоположном тому, в котором движется ваш палец.Идея, стоящая за этим, состоит в том, чтобы смоделировать акт «просеивания» через элементы пальцем, поскольку предполагается, что каждый элемент на пути вашего касания подвергается воздействию / манипулированию.
Проблема
Проблема заключается в том, что прокрутка UIScrollView вызывает триггеры touchesCancelled, таким образом заканчивая вызовы touchesMoved, на которые игра рассчитывает узнать, какими элементами манипулировать.Даже если движение пальца визуально не приводит к прокрутке вида, перемещение пальца на расстояние более 10 пикселей вызывает метод touchesCancelled, тем самым заканчивая будущие вызовы touchesMoved, пока я не подниму палец и не начну новое событие касания.
Я уверен, что это событие прокрутки вызывает метод touchesCancelled, потому что, если я установил self.scrollingEnabled = NO;
в представлении, перемещение пальца по экрану продолжит вызывать touchSMoved, как и должно быть, независимо от того, как далеко япри перемещении пальца по экрану touchchesEnded вызывается, как и ожидалось, когда я поднимаю палец (после того как я закончил просеивать элементы), и каждый элемент на пути моего касания / удара действительно манипулируется по желанию.Однако установка этого свойства естественным образом предотвращает желаемую прокрутку игровой сетки.
Неудачные попытки исправить
Я пытался установить self.canCancelContentTouches = NO;
в методе initWithFrame
зрения, но touchesCancelled
все еще срабатывает, как ни странно.Не уверен, почему это так!Возможно, я понял это не в том месте, но я не уверен, что это даже решило бы мою проблему, потому что документы подразумевают, что такой параметр в любом случае предотвратит прокрутку: "Если значение этого свойстваесли НЕТ, представление прокрутки не прокручивается независимо от движения пальца, как только представление содержимого начинает отслеживать. " Очевидно, что это не то поведение, которое мне нужно, так что это свойство, кажется, не является тем, что мне интересно послевсе.Хотя я все еще недоумеваю, почему он все еще прокручивается и вызывается touchesCancelled
, но я отвлекся.
Я также добавил метод - (BOOL)touchesShouldCancelInContentView:(UIView *)view
, но он не вызывается, даже без установка self.canCancelContentTouches = NO;
, поскольку в документах говорится, что установка для свойства canCancelTouches значения NO действительно предотвратит вызов метода touchesShouldCancelInContentView: "Представление прокрутки не вызывает этот метод, если значением свойства canCancelContentTouches является NO." .Хотя в документах, похоже, неясно, будет ли возврат NO из этого метода также препятствовать прокрутке, как при установке canCancelContentTouches = NO;
.Если нет, то это должно быть идеальным решением.Опять же, я понятия не имею, почему этот метод даже не вызывается, поскольку в документах упоминается только одно свойство / параметр, который предотвращает его вызов, и он все еще не вызывается даже с тем свойством, для которого не установлено значение NO.(по умолчанию ДА).
Куда я иду отсюда?
Так что теперь я в растерянности.Дело в том, что мне все еще нужно touchchesMoved, чтобы продолжать вызываться после прокрутки представления.Это вообще возможно?Если нет, то какие у меня есть варианты?