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.