Как использовать два разных метода для SWIPE поверх кнопки и TouchUpInside? - PullRequest
0 голосов
/ 24 мая 2011

У меня есть вид, в котором у меня есть несколько больших кнопок, которые я настроил так:

SwipeButton* btn = [[[SwipeButton alloc] initWithFrame:CGRectMake(55, 0, 300, 50)] autorelease];    
btn.tag = k;

[btn setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"titleBackground.png"]] 
                                                              forState:UIControlStateNormal];
[btn   addTarget:self
          action:@selector(indexAction:)
forControlEvents:UIControlEventTouchUpInside];

Я хотел бы иметь возможность либо коснуться этих кнопок, а затем запустить метод indexAction, либо - если считывание было распознано - запустить другой метод.

Я думал, что подкласс UIButton должен проходить через пролистывания, но на самом деле это не решение, так как теперь распознаются и пролистывания, и щелчки, поэтому оба метода запускаются.

Есть ли способ обойти это? Как я могу расставить приоритеты смахивания и разрешить touchupinside только если не было смахивания?

Любая помощь будет принята с благодарностью.

Вот как я подклассифицировал UIB-кнопку:

#import "SwipeButton.h"

@implementation SwipeButton

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    [self.superview touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    [super touchesMoved:touches withEvent:event];
    [self.superview touchesMoved:touches withEvent:event];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    [self.superview touchesEnded:touches withEvent:event];

} 
@end

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

Не думаю, что вам нужно создавать подкласс класса UIButton. Почему бы вам не попробовать что-то вроде этого:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *image = [UIImage imageNamed:@"picture_0.png"];
[button setImage:image forState:UIControlStateNormal];
[button setFrame:CGRectMake((applicationFrame.size.width - image.size.width)/2, applicationFrame.size.height/2, image.size.width, image.size.height)];
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];

UISwipeGestureRecognizer *recognizer;

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:UISwipeGestureRecognizerDirectionRight];
[recognizer setDelegate:self];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:UISwipeGestureRecognizerDirectionLeft];
[recognizer setDelegate:self];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];

Затем вы создаете методы для обработки нажатий и ударов по кнопке:

// Prevent recognizing touches on the slider
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

if ([touch.view isKindOfClass:[UIButton class]]) {
    return YES;
}
return NO;
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {

if ([recognizer direction] == UISwipeGestureRecognizerDirectionLeft) {

    // Handle left swipe
    NSLog(@"left swipe");

} else {

    // Handle right swipe
    NSLog(@"right swipe");

}
}

- (void)buttonTapped:(id)sender {

NSLog(@"button pressed");

}

Первый из трех предыдущих методов объявлен в протоколе, поэтому не забудьте сказать, что ваш класс реализует этот протокол:

@interface MyViewController : UIViewController <UIGestureRecognizerDelegate>

Это работает, я просто попробовал сам. Надеюсь, поможет! ;)

1 голос
/ 24 мая 2011

Ознакомьтесь с документацией UIGestureRecognizer и соответствующими примерами ( например, ).

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