2013-04-25 2 views
3

Я создал собственный подкласс от UIScrollView и внедрил методы touchesBegan, touchesMoved, touchesEnded и touchesCancelled.Можно ли настроить распознавание жестов, которое запускает прокрутку UIScrollView?

Однако я не удовлетворен тем, как все работает. В частности, когда упоминаются способы вызова и когда UIScrollView решают фактически прокручивать (перетаскивать).

UIScrollView свитки, даже если разница между первой точкой касания и последней точкой касания очень мало в вертикальном направлении. Так что я могу ударить почти горизонтально и UIScrollView будет перемещаться вверх или вниз в зависимости от той небольшой разницей. (Что прекрасно в нормальных случаях использования)

Default UIScrollView behavior

Оба этих мазков приведет UIScrollView прокручивать вниз ,

Однако мне интересно было бы возможно, чтобы настроить его как-то, так что он ведет себя так, как это:

Desired behavior

В основном так, что вблизи горизонтального считывания получает подобран touchesBegan и связанные с ними методы и делает не инициировать прокрутку. Зеленый направление считывания, однако все равно начать прокрутку ...

EDIT:

Я забыл упомянуть, touchesBegan и близкие не дозвонились, если вы держите палец в течение короткого периода времени на экране, а затем переместить это вокруг. Итак, не классический жестов ...

ответ

2

Кристофер Nassar правильно указал, что я должен используйте UIPanGestureRecognizer, поэтому я немного экспериментировал с ним.

То, что я узнал, что если добавить UIPanGestureRecognizer к надтаблицы, который содержит ваш UIScrollView. Затем UIScrollView, встроенный в распознаватель жести, будет работать в паре с вашим собственным UIPanGestureRecognizer точно так, как я хотел!

Горизонтальное и рядом горизонтальные пойла будет подхвачено UIPanGestureRecognizer из надтаблицы и всех других вертикальных со стороной UIScrollView (обычаем), построенной в кастрюле жеста распознавателя и заставить его прокручивать ...

Я полагаю, что UIScrollView был разработан таким образом, потому что поведение по умолчанию будет то, что только один из этих панорамирование жест распознования триггеров, или оба одновременно, если UIScrollView возвращает YES из этого UIPanGestureRecognizerDelegate метода:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; 

Однако кажется, что UIScrollView имеет дополнительную логику для выборочного отключения (для горизонтальных прокруток) своего собственного распознавателя панорамирования в случае, если существует еще один.

Возможно, кто-то здесь знает больше об этом.

Так резюмировать это решение было для меня, чтобы добавить UIPanGestureRecognizer внутри viewDidLoad в моем UIViewController. (Примечание: UIScrollView добавляется как подвид к этому UIViewController зрения)

UIPanGestureRecognizer *myPanGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
[self.view addGestureRecognizer:myPanGestureRecognizer]; 

, а затем добавить метод обработчика:

- (void)handlePan:(UIPanGestureRecognizer *)recognizer 
{ 
    NSLog(@"Swiped horizontally..."); 
} 
2

Иван, я думаю, вы пытаетесь сделать тот же эффект, что и на странице Facebook, и перетащите прокрутку, поэтому пусть прокрутка будет следовать за вашим пальцем, если это правильно, я предлагаю что вы забудете о прикасается событий, и начать с UIPanGesture, его лучшим в этих случаях, так внутри делегата, который вызывает этот жест, поместите следующий код для него:

//The sender view, in your case the scollview 
    UIScrollView* scr = (UIScrollView*)sender.view; 
    //Disable the scrolling flag for the sake of user experience 
    [scr setScrollEnabled:false]; 

    //Get the current translation point of the scrollview in respect to the main view 
    CGPoint translation = [sender translationInView:self.view]; 

    //Set the view center to the new translation point 
    float translationPoint = scr.center.x + translation.x; 
    scr.center = CGPointMake(translationPoint,scr.center.y); 
    [sender setTranslation:CGPointMake(0, 0) inView:self.view]; 
+0

Хороший вопрос! Я только что попробовал приложение Facebook, и это похоже на то, что .. если вы проведите пальцем влево или вправо, лента новостей (предположительно UIScrollView) скользит в сторону ... Я сейчас попробую ваше предложение. Однако я должен отметить, что на самом деле я не пытаюсь открыть боковое меню, но на самом деле изменить значение переменной NSInteger (увеличение/уменьшение) в отношении горизонтального прокрутки или перетаскивания ... –

Смежные вопросы