我需要识别所有方向的滑动(向上/向下/向左/向右)。不是同时,但我需要认识到它们。
我试过了:
UISwipeGestureRecognizer *Swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(SwipeRecognizer:)];
Swipe.direction = (UISwipeGestureRecognizerDirectionLeft |
UISwipeGestureRecognizerDirectionRight |
UISwipeGestureRecognizerDirectionDown |
UISwipeGestureRecognizerDirectionUp);
[self.view addGestureRecognizer:Swipe];
[Swipe release];
但SwipeRecognizer
以下是SwipeRecognizer的代码:
- (void) SwipeRecognizer:(UISwipeGestureRecognizer *)sender {
if ( sender.direction == UISwipeGestureRecognizerDirectionLeft )
NSLog(@" *** SWIPE LEFT ***");
if ( sender.direction == UISwipeGestureRecognizerDirectionRight )
NSLog(@" *** SWIPE RIGHT ***");
if ( sender.direction == UISwipeGestureRecognizerDirectionDown )
NSLog(@" *** SWIPE DOWN ***");
if ( sender.direction == UISwipeGestureRecognizerDirectionUp )
NSLog(@" *** SWIPE UP ***");
}
我该怎么做?如何为我的滑动对象分配所有不同的方向?
答案 0 :(得分:21)
您可以像这样设置方向
UISwipeGestureRecognizer *Swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(SwipeRecognizer:)];
Swipe.direction = (UISwipeGestureRecognizerDirectionLeft |
UISwipeGestureRecognizerDirectionRight |
UISwipeGestureRecognizerDirectionDown |
UISwipeGestureRecognizerDirectionUp);
这就是你收到回调时的方向,所以你所有的测试都失败是正常的。如果你有
- (void) SwipeRecognizer:(UISwipeGestureRecognizer *)sender {
if ( sender.direction | UISwipeGestureRecognizerDirectionLeft )
NSLog(@" *** SWIPE LEFT ***");
if ( sender.direction | UISwipeGestureRecognizerDirectionRight )
NSLog(@" *** SWIPE RIGHT ***");
if ( sender.direction | UISwipeGestureRecognizerDirectionDown )
NSLog(@" *** SWIPE DOWN ***");
if ( sender.direction | UISwipeGestureRecognizerDirectionUp )
NSLog(@" *** SWIPE UP ***");
}
测试会成功(但是一切都会成功,所以你不会从中得到任何信息)。如果您想区分不同方向的滑动,则需要单独的手势识别器。
正如评论中所指出的,请参阅this answer。显然即使这不起作用。您应该只使用一个方向创建滑动,以使您的生活更轻松。
答案 1 :(得分:4)
很遗憾,您无法使用direction
属性来侦听识别器;它只会通过识别器为您提供检测到的方向。我为此目的使用了两个不同的UISwipeGestureRecognizer
,请在此处查看我的答案:https://stackoverflow.com/a/16810160/936957
答案 2 :(得分:4)
我之前遇到过这个问题。我最终做的是创建一个UIView子类,重写touchesMoved:
并做一些数学计算方向。
以下是一般概念:
#import "OmnidirectionalControl.h"
typedef NS_ENUM(NSInteger, direction) {
Down = 0, DownRight = 1,
Right = 2, UpRight = 3,
Up = 4, UpLeft = 5,
Left = 6, DownLeft = 7
};
@interface OmnidirectionalControl ()
@property (nonatomic) CGPoint startTouch;
@property (nonatomic) CGPoint endTouch;
@end
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
self.startTouch = [[touches allObjects][0] locationInView:self];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
self.lastTouch = [[[touches allObjects] lastObject] locationInView:self];
NSLog(@"Direction: %d", [self calculateDirectionFromTouches]);
}
-(direction)calculateDirectionFromTouches {
NSInteger xDisplacement = self.lastTouch.x-self.startTouch.x;
NSInteger yDisplacement = self.lastTouch.y-self.startTouch.y;
float angle = atan2(xDisplacement, yDisplacement);
int octant = (int)(round(8 * angle / (2 * M_PI) + 8)) % 8;
return (direction) octant;
}
为了简单起见,在touchesMoved:
中,我只记录方向,但您可以使用该信息执行您想要的操作(例如,将其传递给代理人,使用它发布通知等)。在touchesMoved
中你还需要一些方法来识别刷卡是否完成,但这与问题不太相关,所以我会留给你。 calculateDirectionFromTouches
中的数学解释为here。
答案 3 :(得分:2)
我终于找到了最简单的答案,如果您同意,请将此标记为答案。
如果你只有一个方向滑动+平移,你只需说: [myPanRecogznier requireGestureRecognizerToFail:mySwipeRecognizer];
但是如果您有两次或更多次滑动,则无法将数组传递给该方法。为此,您需要实现UIGestureRecognizerDelegate。
例如,如果要识别2次滑动(左侧和右侧)并且您还希望允许用户平移,则将手势识别器定义为属性或实例变量,然后将VC设置为委托在平底锅手势识别器上:
_swipeLeft = [[UISwipeGestureRecognizer alloc] ...]; // use proper init here
_swipeRight = [[UISwipeGestureRecognizer alloc] ...]; // user proper init here
_swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
_swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
_pan = [[UIPanGestureRecognizer alloc] ...]; // use proper init here
_pan.delegate = self;
// then add recognizers to your view
然后你实现 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer委托方法,如下所示:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if (gestureRecognizer == _pan && (otherGestureRecognizer == _swipeLeft || otherGestureRecognizer == _swipeRight)) {
return YES;
}
return NO;
}
这告诉平移手势识别器只有在左右滑动都无法识别时才能工作 - 完美!
希望将来Apple会让我们将数组传递给requireGestureRecognizerToFail:方法。
答案 4 :(得分:1)
您只能通过SwipeGesture添加一个对角线,然后......
UISwipeGestureRecognizer *swipeV = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(action)];
UISwipeGestureRecognizer *swipeH = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(action)];
swipeH.direction = ( UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight );
swipeV.direction = ( UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown );
[self addGestureRecognizer:swipeH];
[self addGestureRecognizer:swipeV];
self.userInteractionEnabled = YES;
答案 5 :(得分:0)
使用UIPanGestureRecogizer并检测您关心的滑动方向。有关详细信息,请参阅UIPanGestureRecognizer文档。 -rrh
// add pan recognizer to the view when initialized
UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRecognized:)];
[panRecognizer setDelegate:self];
[self addGestureRecognizer:panRecognizer]; // add to the view you want to detect swipe on
-(void)panRecognized:(UIPanGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateBegan) {
// you might want to do something at the start of the pan
}
CGPoint distance = [sender translationInView:self]; // get distance of pan/swipe in the view in which the gesture recognizer was added
CGPoint velocity = [sender velocityInView:self]; // get velocity of pan/swipe in the view in which the gesture recognizer was added
float usersSwipeSpeed = abs(velocity.x); // use this if you need to move an object at a speed that matches the users swipe speed
NSLog(@"swipe speed:%f", usersSwipeSpeed);
if (sender.state == UIGestureRecognizerStateEnded) {
[sender cancelsTouchesInView]; // you may or may not need this - check documentation if unsure
if (distance.x > 0) { // right
NSLog(@"user swiped right");
} else if (distance.x < 0) { //left
NSLog(@"user swiped left");
}
if (distance.y > 0) { // down
NSLog(@"user swiped down");
} else if (distance.y < 0) { //up
NSLog(@"user swiped up");
}
// Note: if you don't want both axis directions to be triggered (i.e. up and right) you can add a tolerence instead of checking the distance against 0 you could check for greater and less than 50 or 100, etc.
}
}
CHANHE in STATEEND CODE WIH
//如果你只想从上,下,左和右单向滑行
if (sender.state == UIGestureRecognizerStateEnded) {
[sender cancelsTouchesInView]; // you may or may not need this - check documentation if unsure
if (distance.x > 0 && abs(distance.x)>abs(distance.y)) { // right
NSLog(@"user swiped right");
} else if (distance.x < 0 && abs(distance.x)>abs(distance.y)) { //left
NSLog(@"user swiped left");
}
if (distance.y > 0 && abs(distance.y)>abs(distance.x)) { // down
NSLog(@"user swiped down");
} else if (distance.y < 0 && abs(distance.y)>abs(distance.x)) { //up
NSLog(@"user swiped up");
}
}
答案 6 :(得分:0)
UISwipeGestureRecognizer *Updown=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)];
Updown.delegate=self;
[Updown setDirection:UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp];
[overLayView addGestureRecognizer:Updown];
UISwipeGestureRecognizer *LeftRight=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)];
LeftRight.delegate=self;
[LeftRight setDirection:UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight];
[overLayView addGestureRecognizer:LeftRight];
overLayView.userInteractionEnabled=NO;
-(void)handleGestureNext:(UISwipeGestureRecognizer *)recognizer
{
NSLog(@"Swipe Recevied");
}
答案 7 :(得分:0)
它可能不是最佳解决方案,但您始终可以为要检测的每个滑动方向指定不同的UISwipeGestureRecognizer。
在viewDidLoad方法中,只需定义所需的UISwipeGestureRecognizer:
- (void)viewDidLoad{
UISwipeGestureRecognizer *recognizerUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeUp:)];
recognizerUp.direction = UISwipeGestureRecognizerDirectionUp;
[[self view] addGestureRecognizer:recognizerUp];
UISwipeGestureRecognizer *recognizerDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeDown:)];
recognizerDown.direction = UISwipeGestureRecognizerDirectionDown;
[[self view] addGestureRecognizer:recognizerDown];
}
然后只需实现相应的方法来处理滑动:
- (void)handleSwipeUp:(UISwipeGestureRecognizer *)sender{
if (sender.state == UIGestureRecognizerStateEnded){
NSLog(@"SWIPE UP");
}
}
- (void)handleSwipeDown:(UISwipeGestureRecognizer *)sender{
if (sender.state == UIGestureRecognizerStateEnded){
NSLog(@"SWIPE DOWN");
}
}