UIScrollView трогает Начало

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

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

8 ответов

Решение

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

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

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

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

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

Или же

сделать подкласс вашего 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];
   }
}

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

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

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

- (BOOL)canBecomeFirstResponder {
    return YES;
}

Затем в "viewDidAppear" вам нужно вызвать "становление FirstResponder":

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self becomeFirstResponder];

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

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)
        }
    }
}

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

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

Другие вопросы по тегам