Я хотел бы обрабатывать прикосновения (в частности, горизонтальный слайд) в подклассе UIViewController, который я сделал, но проблема в том, что представление контроллера содержит UIScrollView, который охватывает весь экран, поэтому события «touchesBegan:» и «touchesEnded:» никогда не вызываются в моем контроллере. Прокрутка прокручивается только по вертикали.
Как лучше всего заставить его обрабатывать эти события? Сделать мой UIViewController также унаследованным от UIScrollView и обрабатывать касания по мере необходимости (и удалить текущее представление прокрутки) или использовать подкласс UIScrollView вместо моего текущего представления прокрутки, который будет вызывать метод делегата для тех случаев, которые мне нужны? А может есть другой способ?
Вот мой текущий код:
// View creation and adding to parent
NewViewController* newViewController = [[newViewController alloc] initWithNibName:@"NewViewController" bundle:nil];
[self.view addSubview:newViewController.view];
// NewViewController.h
@interface NewViewController : UIViewController {
IBOutlet UIScrollView* scrollView;
// other outlets and properties
}
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event;
В IB представление NewViewController содержит scrollView, который содержит все другие выходы (метки, кнопки) ... Цель состоит в том, чтобы получить scrollView NewViewController для вызова методов touchesBegan и touchesEnded NewViewController.
Обновление: ScrollViewSuite очень помог мне понять, как обрабатываются обратные вызовы касаний. UIScrollView
вызывает их только тогда, когда прикосновения не заставляют его прокручиваться.
Итак, три случая:
- Наклонное скольжение (даже немного, как только появляется полоса прокрутки): метод
touches
не вызывается - Идеально горизонтальный слайд (полоса прокрутки не появляется): вызываются
touchesBegan
,touchesMoved
иtouchesEnded
- Любое прикосновение, которое не вызывает прокрутки (касание без перемещения или горизонтальное перемещение), за которым следует слегка вертикальное скольжение: вызываются
touchesBegan
,touchesMoved
иtouchesCancelled
;
Отмена касаний можно избежать, установив для UIScrollView
canCancelContentTouches
значение FALSE
, но это, очевидно, работает только в том случае, если был вызван touchesBegan
, что означает, что методы касаний по-прежнему не будут вызываться для первого случая.
Но UIScrollView
имеет свойство, называемое delaysContentTouches, которое по умолчанию установлено на TRUE
и заставляет его немного подождать, когда начинается прикосновение, чтобы увидеть, заставит ли оно его прокрутить. Если установлено значение FALSE
, методы касания вызываются, как только начинается касание, и позволяют подклассам обрабатывать их по своему усмотрению.
TL; DR: Мне кажется, что самый простой способ (если вы не можете использовать UIGestureRecognizer
) - создать подкласс UIScrollView
, установить для его свойства delayContentTouches
значение FALSE
и переопределить функции касаний (также touchesShouldBegin
/ touchesShouldCancel
как touchesBegan
/ _24 _...) в соответствии с вашими потребностями.