2017-01-01 4 views
0

Я пытаюсь сделать слайд UIView между 2 точками на слайде. Я попытался использовать UIPanGestureRecognizer. Скольжение в порядке, но когда представление достигает предельной точки, происходит ухабистый прыжок. Это негласно. Это моя функция жеста:Скользящий UIView между 2 фиксированными точками

func wasDragged(gestureRecognizer: UIPanGestureRecognizer) { 
    if gestureRecognizer.state == UIGestureRecognizerState.began || gestureRecognizer.state == UIGestureRecognizerState.changed { 
     let translation = gestureRecognizer.translation(in: self.view) 
     print(gestureRecognizer.view!.center.x) 
     if(gestureRecognizer.view!.center.x <= self.view.frame.width) && (gestureRecognizer.view!.center.x >= self.view.frame.width - 100) { 
      gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y) 
     }else if (gestureRecognizer.view!.center.x > self.view.frame.width){ 
      gestureRecognizer.view!.center = CGPoint(x: self.view.frame.width, y: gestureRecognizer.view!.center.y) 
     }else if (gestureRecognizer.view!.center.x < self.view.frame.width - 100){ 
      gestureRecognizer.view!.center = CGPoint(x: self.view.frame.width - 100, y: gestureRecognizer.view!.center.y) 
     } 

     gestureRecognizer.setTranslation(CGPoint(x: 0,y: 0), in: self.view) 
    } 


} 

Любая помощь? Благодарю.

+0

Ваш код очень спорный. Его можно было бы записать гораздо более аккуратно и компактно, используя несколько промежуточных локальных переменных. Вы не должны устанавливать 'center', точку, в терминах' width', length. И почему ваш третий тест 'else if' ли центр x равен _less_, чем ширина минус 100? Конечно, вы тогда прыгаете на ширину минус 100! Это то, что говорит ваш код. – matt

+0

Хорошо, что y фиксировано. Я перемещаю customView между двумя точками с координатами: шириной исходного вида и этой шириной -100. –

+0

«Ширина исходного вида» не является точкой, а не координатой. Это длина. – matt

ответ

1

Ваша проблема в том, что вы смотрите, где находится вид, а не там, где он будет после применения текущего перемещения.

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

@IBAction func wasDragged(gestureRecognizer: UIPanGestureRecognizer) { 
    if gestureRecognizer.state == .began || gestureRecognizer.state == .changed { 
     let translation = gestureRecognizer.translation(in: self.view) 
     print(gestureRecognizer.view!.center.x) 
     let newx = gestureRecognizer.view!.center.x + translation.x 

     if(newx <= self.view.frame.width) && (newx >= self.view.frame.width - 100) { 
      gestureRecognizer.view!.center = CGPoint(x: newx, y: gestureRecognizer.view!.center.y) 
     }else if (newx > self.view.frame.width){ 
      gestureRecognizer.view!.center = CGPoint(x: self.view.frame.width, y: gestureRecognizer.view!.center.y) 
     }else if (newx < self.view.frame.width - 100){ 
      gestureRecognizer.view!.center = CGPoint(x: self.view.frame.width - 100, y: gestureRecognizer.view!.center.y) 
     } 

     gestureRecognizer.setTranslation(CGPoint(x: 0,y: 0), in: self.view) 
    } 
} 

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

С ниже изменениями, вид не будет двигаться вправо, пока палец пользователя не возвращается к исходной точке касания:

gestureRecognizer.setTranslation(CGPoint(x: newx - gestureRecognizer.view!.center.x ,y: 0), in: self.view) 

Попробуйте и посмотрите, какой вы предпочитаете.

+1

Спасибо! :-) –

+0

Я обновил ответ, чтобы добавить предложение о вашем последнем вызове 'setTranslation'. Взглянуть. – vacawama

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