2017-01-01 6 views
0

スライドタッチで2点の間でUIViewをスライドさせようとしています。私はUIPanGestureRecognizerを使ってみました。スライドはうまくいきますが、ビューが限界点に達すると、不規則なジャンプがあります。それは滑らかではありません。これは私のジェスチャー機能です:2つの固定点の間のUIViewのスライディング

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'という長さで設定するべきではありません。そしてなぜあなたの3番目の 'else if'が中心xがwidth-minusよりも_less_であるかどうかをテストしていますか?もちろん幅からマイナス100にジャンプします!それがあなたのコードが言うことです。 – matt

+0

yは固定されています。最初のビューの幅とこの幅-100の2点間でcustomViewを移動します。 –

+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

関連する問題