2015-07-23 5 views
0

У меня есть UIView, это круг. Это все приложение - я могу перемещать круг вокруг экрана, используя UIPanGestureRecognizer. Теперь я не хочу, чтобы мой круг мог быть вытащен с экрана. Например, если я перетаскиваю круг вправо, он должен прекратить перемещать круг, когда правый край попадает в край окна.Остановить UIView от выхода экрана

Вот мой код:

switch rec.state { 
     case .Began: 
      x = fingerLocation.x - (myView?.center.x)! 
      y = fingerLocation.y - (myView?.center.y)! 
      break 


     case .Changed: 
      myView?.center.x = fingerLocation.x - x 
      myView?.center.y = fingerLocation.y - y 

      if (myView?.center.x)! + (myView!.bounds.width/2) >= view.bounds.width { 
       myView?.center.x = view.bounds.width - myView!.bounds.width/2 
      } 
      break 
     case .Ended: 
      myView?.center = CGPointMake(fingerLocation.x - x, fingerLocation.y - y) 
      break 
} 

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

ответ

2

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

case .Changed: 
    let currentRightEdge = CGRectGetMaxX(myView!.frame) 
    let potentialRightEdge = currentRightEdge + fingerLocation.x - x 
    if potentialRightEdge >= view.bounds.width { 
    myView?.center.x = view.bounds.width - myView!.bounds.width/2 
    } 
    else { 
    myView?.center.x = potentialRightEdge 
    } 
    myView?.center.y = fingerLocation.y - y 

Кроме того, я не думаю, что вам нужно break в Swift ;-).

+0

Не могли бы вы, возможно, опубликовать некоторые псевдокод? Я занимаюсь этим пару часов с небольшим успехом. – MortalMan

+0

Спасибо! Как вы можете использовать x, не зная, что это такое? – MortalMan

+0

Что-то вроде кода, который я добавил в свой ответ. Может быть сокращено, я сделал его более подробным для ясности. – Mundi

0

Проблема может заключаться в том, что если изображение выходит за пределы экрана, вы дважды устанавливаете myView?.center.x. Попробуйте это:

case .Changed: 
      myView?.center.y = fingerLocation.y - y 
      var newX : Int = fingerLocation.x - x 

      if (newX + (myView!.bounds.width/2)) >= view.bounds.width { 
       myView?.center.x = view.bounds.width - myView!.bounds.width/2 
      } else { 
       myView?.center.x = newX 
      } 
      break 
+0

Хотите посмотреть, что такое '' '' '' '' '' '' '' '' '' '' '' '? Там, где по кругу пользователь забирает. 'x = fingerLocation.x - (myView? .center.x)! y = fingerLocation.y - (myView? .center.y)! ' – MortalMan

0

Попробуйте что-то вроде этого:

case .Changed: 
    var targetX = fingerLocation.x - x 
    if targetX < 0 { 
     targetX = 0 
    } else if targetX > CGRectGetWidth(view.bounds) { 
     targetX = CGRectGetWidth(view.bounds) 
    } 

    var targetY = fingerLocation.y - y 
    if targetY < 0 { 
     targetY = 0 
    } else if targetY > CGRectGetHeight(view.bounds) { 
     targetY = CGRectGetHeight(view.bounds) 
    } 

    myView?.center = CGPoint(x: targetX, y: targetY) 
Смежные вопросы