2014-12-04 5 views
3

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

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

Как я могу заменить его своим собственным распознавателем?

+0

Вы используете Objective-C или Swift? –

+0

@ A.R.Younce Я использую Swift. Но все, что возможно с помощью Objective-C, должно быть возможно с Swift, верно? – drasto

+0

В настоящее время пользовательские подклассы UIGestureRecognizer не могут быть записаны в Swift. Я просто хотел знать, чтобы помочь придумать пример кода. –

ответ

0

Вы можете попробовать разместить ясный UIView над scrollView и затем добавить к нему UIPanGestureRecognizer. Затем вы сможете установить селектор для этого GestureRecognizer, который затем может прокрутить прокрутку прокрутки. Но тогда вы будете нести ответственность за определение расстояния для прокрутки для каждой сковороды с высокой скоростью.

+0

Я могу добавить 'UIPanGestureRecognizer' непосредственно в' UISrollView' и отключить значение по умолчанию, установив 'scrollEnabled = false' (или путем реализации метода' UIGestureRecognizerDelegate' 'shouldReceiveTouch' в режиме прокрутки и всегда возвращающего' false'). Определить, насколько далеко будет прокручиваться скоростная панорама, также не проблема. Думаю, я не хочу потерять подпрыгивание и пейджинг - и когда 'contentOffset' или видимый прямоугольник устанавливается на' UIScrollView' программно, он не отскакивает и не перемещается на ближайшую страницу. – drasto

1

Изменение базового распознавателя жестов - неправильный путь. То, что вы хотите сделать, возможно, может быть достигнуто путем внедрения метода gestureRecognizer(_:shouldReceiveTouch:)UIGestureRecognizerDelegate.

Пока представление прокрутки, которое вы хотите настроить, не является частью UICollectionView, UITableView или аналогичного класса, тогда вы сможете установить делегат распознавателя жестов. Внутри делегата вы можете использовать метод UIPanGestureRecognizer velocityInView(_:), чтобы решить, хотите ли вы, чтобы распознаватель жестов запускал прокрутку.

+0

Спасибо, но я должен не согласиться. В настоящее время я уже использую делегат - не метод 'shouldReceiveTouch', а скорее' gestureRecognizerShouldBegin'. Он не делает то, что нужно. Чтобы выполнить то, что мне нужно, просто используя делегат для фильтрации касаний, возможно, но очень сложно.Что еще более важно - это взлом «UIPanGestureRecognizer» в распознавание другого жестов, а затем панорамирование с помощью его делегата. Определенно не правильный путь. И делегат не является мясом для него, поэтому он не обеспечивает достаточного контроля. Его просто не тот же жест, мне нужен другой распознаватель. – drasto

+1

Манипулирование распознавателей жестов классов инфраструктуры UIKit не рекомендуется по тем же причинам, что и манипулирование их частными представлениями. Ваше приложение может сломаться при внесении внутренних изменений. Если использование делегата не будет работать для вас, вам, вероятно, понадобится пользовательский прокручиваемый вид (а не подкласс UIScrollView). –

+0

Ну, если невозможно заменить детектора панорамирования по умолчанию каким-либо документированным способом, мне нужно будет сделать гораздо больше кода, чтобы воссоздать всю функциональность перетаскивания и прокрутки - что-то вроде того, что вы предлагаете. Но до этого я создам щедрость по этому вопросу и посмотрю, что из этого выйдет. благодаря – drasto

0

Вы также можете реализовать метод touchesMoved здесь. Вы можете сделать сравнение между касаниями, чтобы проверить скорость. что-то вроде этого, но это псевдо-код

global firstpoint; 
global secondpoint 

override func touchesBegan(touches: NSSet, withEvent event: UIEvent){ 

for touch: AnyObject in touches { 
     let firstpoint = (touch as UITouch).locationInNode(self); 

} 
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { 

    for touch: AnyObject in touches { 
     let secondpoint = (touch as UITouch).locationInNode(self); 
    } 
    let diffx = secondpoint - firstpoint; 
    if diffx > "some value you choose for velocity"{ 
     "do some action that you want"; 
    } 
    else { 
     firstpoint = secondpoint; 
    } 
} 

Это даст вам некоторую скорость для движения, которое вы могли бы использовать для подачи дальнейших действий.