Я бы хотел обрабатывать касания (в частности, горизонтальный слайд) в подклассе 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 вызывать методы touchViewBegan и 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
, а также * 1051).* / touchesMoved
...) в соответствии с вашими потребностями.