В моих предыдущих комментариях, я не ясно, почему вы были подклассов, но уточнить и это потому, что у вас много обработчиков жестов. Отлично.
Так вот некоторые примеры кода для пользовательского панорамирование жест, HorizontalPanGestureRecognizer, который срабатывает только тогда, когда первое движение по горизонтали:
// HorizontalPanGestureRecognizer.h
#import <UIKit/UIKit.h>
@interface HorizontalPanGestureRecognizer : UIPanGestureRecognizer
@end
И
// HorizontalPanGestureRecognizer.m
#import "HorizontalPanGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>
@interface HorizontalPanGestureRecognizer()
{
BOOL _hasConfirmedDirection;
BOOL _wasHorizontal;
CGPoint _origLoc;
}
@end
@implementation HorizontalPanGestureRecognizer
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
_hasConfirmedDirection = NO;
_origLoc = [touch locationInView:self.view];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
if (self.state == UIGestureRecognizerStateFailed) return;
if (!_hasConfirmedDirection)
{
CGPoint translation = [self translationInView:self.view];
_hasConfirmedDirection = YES;
_wasHorizontal = (fabs(translation.x) > fabs(translation.y));
}
if (!_wasHorizontal)
self.state = UIGestureRecognizerStateFailed;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
if (!_wasHorizontal)
self.state = UIGestureRecognizerStateFailed;
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesCancelled:touches withEvent:event];
if (!_wasHorizontal)
self.state = UIGestureRecognizerStateFailed;
}
- (CGPoint)locationInView:(UIView *)view
{
CGPoint superLocation = [super locationInView:view];
if (_hasConfirmedDirection)
superLocation.y = _origLoc.y;
return superLocation;
}
- (CGPoint)translationInView:(UIView *)view
{
CGPoint superTranslation = [super translationInView:view];
if (_hasConfirmedDirection)
superTranslation.y = 0.0f;
return superTranslation;
}
@end
И тогда вы можете иметь свой обработчик в вашем основном контроллере представления использует его соответствующим образом (в этом примере просто перетаскивая UILabel). В в viewDidLoad, создать жест:
HorizontalPanGestureRecognizer *recognizer = [[HorizontalPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleCustomPan:)];
[self.view addGestureRecognizer:recognizer];
И тогда обработчик будет выглядеть примерно так:
- (void)handleCustomPan:(UIPanGestureRecognizer *)sender
{
switch (sender.state) {
case UIGestureRecognizerStateChanged:
if (!_panLabel)
{
// In my case I'm creating a UILabel to drag around, whereas you might just drag
// whatever countrol you want to drag.
//
// But, regardless, I'm keeping track of the original center in _panLabelOrigCenter
[self makePanLabel:sender];
}
CGPoint translate = [sender translationInView:self.view];
_panLabel.center = CGPointMake(_panLabelOrigCenter.x + translate.x, _panLabelOrigCenter.y + translate.y);
break;
case UIGestureRecognizerStateEnded:
[self removePanLabel];
break;
default:
break;
}
}
(Очевидно, это ARC-код Если не-ARC, добавить необходимые дополнительные линии. код для рутинного управления памятью.)
danh, вероятно, идет по правильной линии мысли. Из любопытства, что вы пытаетесь сделать с этим подклассом распознавания жеста? Если вы просто пытаетесь повернуть влево и вправо, есть более простые способы решить эту проблему. Или у вас есть другой распознаватель жестов, обрабатывающий вертикальное движение, и вы пытаетесь определить, какой распознаватель жестов использовать? Но я бы подумал, что после того, как вы закроетесь в определенном распознавателе, вы прекратите дальнейшую проверку направления движения (чтобы допускать незначительные изменения от движения минутного пальца). – Rob
Он действует на ячейку в GMGridView (UIScrollview), и я просто хочу, чтобы можно было панорамировать содержимое в пределах одной из ячеек влево или вправо, если обнаружено горизонтальное панорамирование, и прокручивать весь вид, если обнаружена вертикальная панорама , Вы говорите, что я должен перестать проверять направление движения, как я могу это сделать? –
Нижняя строка, есть одна переменная, которая отслеживает, подтвердили ли вы, было ли вы проверено направление начального движения, а другое, указывающее, была ли она горизонтальной или нет. Затем вы можете просто проверить эту переменную, которая отслеживает, было ли начальное движение горизонтальным или не определять, измените ли вы состояние на UIGestureRecognizerStateFailed или нет. См. Мой ответ. – Rob