Прокрутка в UIScrollView без запуска касаний Отменено - PullRequest
10 голосов
/ 10 марта 2011

Обзор

Я работаю над игрой для 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, чтобы продолжать вызываться после прокрутки представления.Это вообще возможно?Если нет, то какие у меня есть варианты?

Ответы [ 2 ]

8 голосов
/ 05 декабря 2011

У меня была точно такая же проблема (и я потратил много времени).Затем я попытался установить свойство cancelsTouchesInView как можно скорее (я сделал это в viewDidLoad) ... и оно заработало для меня (, как показано здесь )!

- (void)viewDidLoad {
    [super viewDidLoad];
    /* other initializations */
    scrollView.panGestureRecognizer.cancelsTouchesInView = NO;
}

Это работает в iOS 5. Перед iOS 5 вам нужно пройти через все распознаватели, найти panGestureRecognizer, а затем установить свойство.Так что это должно быть универсальное решение:

- (void)viewDidLoad {
    [super viewDidLoad];
    /* other initializations */
    for (UIGestureRecognizer *gesture in scrollView.gestureRecognizers){
        if ([gesture isKindOfClass:[UIPanGestureRecognizer class]]){
        gesture.cancelsTouchesInView = NO;    
    }
}
0 голосов
/ 10 марта 2011
- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated 

это могло бы сработать .... любой метод touchesMoved может вызвать метод, который будет прокручивать со скоростью, пропорциональной расстоянию между центром экрана (или где-либо еще) и последней записанной позицией касания, пока прикосновение не закругляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...