阻止 UIView 离开屏幕

Posted

技术标签:

【中文标题】阻止 UIView 离开屏幕【英文标题】:Stop UIView from going off screen 【发布时间】:2015-07-23 14:45:20 【问题描述】:

我有一个 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 状态时跳回视图。 我怎样才能阻止圆圈越过边缘?

【问题讨论】:

【参考方案1】:

如果手指位置会导致屏幕外视图,您可以检查首先, 并且仅当视图不会移出屏幕时才移动视图。

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 ;-)。

【讨论】:

你能发布一些伪代码吗?我已经做了几个小时了,进展甚微。 谢谢!你怎么能在不知道它是什么的情况下使用 x 呢? 类似于我添加到答案中的代码。可以缩写,为了清楚起见,我把它写得更详细。 您在代码中引入了 x,但没有解释它是什么或如何计算它。我假设您知道如何使用此变量计算新位置。也许您应该将其添加到您的问题中以澄清。 我就是这么想的。也许是我见过的最短的全类变量;-)。所以它设置在.Began,应该可以,对吧?【参考方案2】:

试试这样的:

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)

【讨论】:

【参考方案3】:

问题可能是如果视图离开屏幕,您设置了两次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

【讨论】:

您想看看xy 是什么吗?圆圈上有用户点击的位置。 x = fingerLocation.x - (myView?.center.x)! y = fingerLocation.y - (myView?.center.y)!

以上是关于阻止 UIView 离开屏幕的主要内容,如果未能解决你的问题,请参考以下文章

React 阻止路由离开

UIView hitTest 阻止点击子视图

阻止用户与底层视图的交互

JavaScript 使用javascript阻止页面离开

uiwebview 阻止访问 uitoolbar 上的按钮

在 UICollectionViewCell 中滑动 UIView 会阻止滚动功能