Перенос переноса переносов, представляющий собой reset между begin-begin и обработчиком (с началом состояния) на iOS7
У меня есть распознаватель жесты, чтобы перетащить панель вверх, вниз, влево или вправо. Когда направление панорамирования невозможно, я не позволяю распознавателю начинать так, чтобы касания могли перейти к другим элементам пользовательского интерфейса внутри панели.
Однако на iOS7 перевод иногда получает reset между gestureRecognizerShouldBegin:
и моим обработчиком жестов handlePan:
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer*)panGR
{
CGPoint trans = [panGR translationInView:self.view];
NSLog(@"should begin trans: (%.2f, %.2f)", trans.x, trans.y);
...
Эти журналы: should begin trans: (18.00, 0.00)
- (void)handlePan:(UIPanGestureRecognizer*)panGR
{
CGPoint trans = [panGR translationInView:self.view];
switch(panGR.state)
{
case UIGestureRecognizerStateBegan:
NSLog(@"handlePan began trans: (%.2f, %.2f)", trans.x, trans.y);
...
Эти журналы: handlePan began trans: (0.00, 0.00)
Это означает, что общий код для определения направления панорамирования (справа в этом случае) работает в gestureRecognizerShouldBegin:
и позволяет начать жест, но затем не может быть определен в handlePan:
, когда state
UIGestureRecognizerStateBegan
.
Является ли это ошибкой в iOS7 или имеет намеренное изменение поведения для размещения новых типов жестов? Кроме того, может ли кто-нибудь предложить хороший способ обойти эту проблему?
Ответы
Ответ 1
UIPanGestureRecognizer
всегда устанавливает перевод на (0,0) после достижения состояния UIGestureRecognizerStateBegan
- поскольку признан даже малейший перевод, который предназначен для работы только в качестве триггера (если вы установите большой порог для начала распознавание типа (50,50), вы, очевидно, получите "отставание" в поведении пользовательского интерфейса - в качестве обходного пути я бы предложил сохранить значение перевода, а затем использовать анимацию UIView для более плавной панорамирования объекта). Вы должны использовать UIGestureRecognizerStateChanged
для обновления перевода и UIGestureRecognizerStateRecognized
для установки конечной точки панорамирования.
Ответ 2
Вы можете определить направление в handlePan:
, проверив, является ли горизонтальный перевод выше или ниже 0. Но в конце handlePan:
вам нужно reset CGPoint
перевода в качестве нового ссылка на следующий перевод.
- (void)handlePan:(UIPanGestureRecognizer*)panGR
{
CGPoint translation = [gr translationInView:self.view];
if (translation.x > 0) {
//Direction: Right
} else if (translation.x < 0) {
//Direction: Left
}
[gr setTranslation:CGPointZero
inView:self.view];
}