阻止 UIView 离开屏幕
Stop UIView from going off screen
我有一个圆形的 UIView。这就是应用程序的全部内容 - 我可以使用 UIPanGestureRecognizer.
在屏幕上移动圆圈 现在我不希望我的圆圈能够被拖出屏幕。例如,如果我向右拖动圆圈,当右边缘碰到 window.
的边缘时,它应该停止移动圆圈
这是我的代码:
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
状态时跳回视图。 我怎样才能阻止圆圈越过边缘?
您可以先检查 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
;-)。
问题可能是如果视图离开屏幕,您设置了两次 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
尝试这样的事情:
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)
我有一个圆形的 UIView。这就是应用程序的全部内容 - 我可以使用 UIPanGestureRecognizer.
在屏幕上移动圆圈 现在我不希望我的圆圈能够被拖出屏幕。例如,如果我向右拖动圆圈,当右边缘碰到 window.
这是我的代码:
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
状态时跳回视图。 我怎样才能阻止圆圈越过边缘?
您可以先检查 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
;-)。
问题可能是如果视图离开屏幕,您设置了两次 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
尝试这样的事情:
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)