阻止UIView离开屏幕

时间:2015-07-23 14:45:21

标签: ios swift uipangesturerecognizer

我有一个UIView是一个圆圈。这就是所有的应用程序 - 我可以使用UIPanGestureRecognizer.在屏幕上移动圆圈现在我不希望我的圆圈能够被拖出屏幕。例如,如果我将圆圈向右拖动,当右边缘碰到窗口边缘时,它应该停止移动圆圈。

这是我的代码:

 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状态被发送。 如何阻止圈子越过边缘?

3 个答案:

答案 0 :(得分: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

另外,我认为你不需要Swift中的break ;-)。

答案 1 :(得分: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

答案 2 :(得分: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)