2012-04-14 2 views
1

Я играл с этим кодом, но не могу понять это правильно.UIScrollView с UIButton и UITapGestureRecognizer

Текущее поведение: я могу свободно перемещаться по UIScrollView даже при нажатии на кнопки. Когда я нажимаю на то, что не является кнопкой, он вызывает метод (например, я хочу его), в результате UITapGestureRecognizer. Тем не менее, я должен удерживать кнопку в течение нескольких секунд, а затем дотронуться до нее, чтобы запустить UIControlEventTouchUpInside кнопки.

Что я хочу: Точно то же самое, но чтобы легко касаться UIButton, как я могу, если я выключу UITapGestureRecognizer на вид, на котором он сидит.

Вот мой код:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 

     //... 

     [cell.xButton addTarget:self action:@selector(xButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

     self.delaysContentTouches = YES; 

     UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)]; 
     [self addGestureRecognizer:tapGestureRecognizer]; 
     tapGestureRecognizer.delegate = self; 
    } 
} 

- (void) handleTapFrom: (UITapGestureRecognizer *)recognizer 
{ 
    [self.header removeKeyboard]; 
} 

ответ

2

Как stavash предложил, вы можете сделать следующее:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    UIView* touchedView = [touch view]; 
    if([touchedView isKindOfClass:[UIButton class]]) { 

     return NO; 
    } 

    return YES; 
} 

Это работает в большинстве случаев. Кроме того, вы можете проверить, является ли затронутый вид потоком прокрутки, используя isDescendantOfView:.

Надеюсь, это поможет.

+0

Это, в сочетании с моим кодом выше, теперь означает, что любые нажатия на UIButton приводят к прямому нажатию на него. Я бы хотел, чтобы это работало так же, как плагин для iPhone, где у вас есть uibuttons на uiscrollview, но касаться их, поскольку вы прокручиваете, не имеет прямого эффекта. – Andrew

2

Я думаю, ваш ответ метод UIGestureRecognizerDelegate в:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

Проверьте вид собственности на ощупь является любой из UIButtons вы пытаетесь избежать: если ВЕРНЕТЕ НЕТ, иначе верните ДА. Не забудьте назначить делегата UITapGestureRecognizer, чтобы он работал. Надеюсь это поможет.

Смежные вопросы