UIScrollView touchBegan

Итак, все, что я хочу сделать, это воспроизвести звук, когда пользователь касается UIScrollView. UIScrollViewDelegate имеет метод scrollViewWillBeginDragging :, но он вызывается только для touchMoved. Я хочу, чтобы он позвонил на touchBegan.

Пробовал touchesBegan: withEvent: но тач не приходит. У кого-нибудь есть ключ к разгадке?


person samvermette    schedule 06.11.2009    source источник


Ответы (8)


Я думаю, вам придется создать подкласс UIScrollView, чтобы это сделать.

touchesBegan: withEvent: отправляется только подклассам UIView. Вы, вероятно, реализуете touchesBegan: withEvent: в своем контроллере, верно? Если так, то оттуда не пойдет ...

В качестве альтернативы, если вы поместите подкласс UIView (который вы написали) в свой UIScrollView, вы также можете оттуда перехватить событие touchesBegan (но только тогда, когда пользователь касается этого конкретного подпредставления). UIScrollView по умолчанию передает касания своим подпредставлениям (см. TouchesShouldBegin: withEvent: inContentView: в UIScrollView).

person Zoran Simic    schedule 06.11.2009

Вместо этого используйте распознаватель жестов касания:

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touch)];
[recognizer setNumberOfTapsRequired:1];
[recognizer setNumberOfTouchesRequired:1];
[scrollView addGestureRecognizer:recognizer];  

Or

сделать подкласс вашего UIScrollView и реализовать все

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

// If not dragging, send event to next responder
  if (!self.dragging){ 
    [self.nextResponder touchesBegan: touches withEvent:event]; 
  }
  else{
    [super touchesEnded: touches withEvent: event];
  }
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

// If not dragging, send event to next responder
    if (!self.dragging){ 
     [self.nextResponder touchesBegan: touches withEvent:event]; 
   }
   else{
     [super touchesEnded: touches withEvent: event];
   }
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

  // If not dragging, send event to next responder
   if (!self.dragging){ 
     [self.nextResponder touchesBegan: touches withEvent:event]; 
   }
   else{
     [super touchesEnded: touches withEvent: event];
   }
}
person Rajneesh071    schedule 20.07.2013
comment
@ Rajneesh071 где вы обрабатываете логическое перетаскивание? обрабатывается ли это автоматически при создании подкласса UIScorllView? - person jeet.chanchawat; 23.02.2015
comment
@ jeet.chanchawat Dude - это подкласс вашего UIScrollView, а перетаскивание - это логическое свойство UIScrollView. - person Rajneesh071; 01.03.2015

Вместо этого используйте распознаватель жестов касания:

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touch)];
[recognizer setNumberOfTapsRequired:1];
[recognizer setNumberOfTouchesRequired:1];
[scrollView addGestureRecognizer:recognizer];
person Roosevelt    schedule 15.01.2013
comment
Хорошо, это работает, но как мне объявить касание метода, чтобы получить место, к которому прикоснулся пользователь? - person Hernan Arber; 05.08.2014
comment
@HernanArber Например: stackoverflow.com/questions/8721864/ - person Roosevelt; 05.08.2014

Вы также можете реагировать на эти события в своем контроллере. Чтобы это работало, вы должны определить эту функцию (в вашем контроллере):

- (BOOL)canBecomeFirstResponder {
    return YES;
}

Затем в viewDidAppear вам нужно вызвать beginFirstResponder:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
person Community    schedule 01.12.2009

Новые обновления по проблеме здесь (включая ссылку на исходный код ZoomScrollView + отличное объяснение внутреннего устройства UIScrollView). Также ознакомьтесь с обновленным примером Apple ScrollViewSuite от Apple.

person DenTheMan    schedule 03.09.2010

Вы должны добавить touchesBegan: withEvent: в свой UIScrollView, а не в UIScrollViewDelegate. UIScrollView - это подкласс UIResponder, который имеет сенсорные события.

person nash    schedule 06.11.2009
comment
Что, если UIScrollView ЯВЛЯЕТСЯ UIScrollViewDelegate? - person aleclarson; 12.03.2014

Rajneesh071 быстро отвечает 4 Измените пользовательский класс scrollView в раскадровке на CustomScrollView

import Foundation

class CustomScrollView: UIScrollView {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if !isDragging {
            next?.touchesBegan(touches, with: event)
        } else {
        super.touchesBegan(touches, with: event)
        }
    }
}
person abhimuralidharan    schedule 06.10.2017

Вам нужно создать подкласс прокрутки, а затем реализовать метод touchesBegan. Вам также необходимо установить для свойства delayTouchDown значение false.

person Tibin Thomas    schedule 02.03.2018