使用平移手势在屏幕的有限区域中移动 UIView
Posted
技术标签:
【中文标题】使用平移手势在屏幕的有限区域中移动 UIView【英文标题】:Move an UIView in a limited area of the screen using pan gesture 【发布时间】:2018-02-20 11:43:45 【问题描述】:在我的应用程序中,当用户在给定边界内的超级视图上沿 y 方向平移时,应沿 y 方向移动 UIView。
它应该是这样工作的
这是我的代码
@IBOutlet weak var uiview: UIView!
// self.view is the supper view of uiview
var uiviewLastCenterPosition = CGPoint(x: 0, y: 0)
var lastTranslation = CGPoint(x: 0, y: 0)
override func viewDidAppear(_ animated: Bool)
self.uiviewLastCenterPosition = self.uiview.center
@IBAction func supperViewPan(_ sender: UIPanGestureRecognizer)
switch sender.state
case .began:
break
case .changed:
let uiviewTop = self.uiview.frame.origin.y
let uiviewBottom = self.uiview.frame.origin.y + self.uiview.frame.size.height
let velocity = sender.velocity(in: self.view)
if velocity.y > 0.0 // down
if uiviewBottom < 600
self.uiview.center.y = (self.uiviewLastCenterPosition.y) + sender.translation(in: self.view).y
self.lastTranslation = sender.translation(in: self.view)
else
sender.setTranslation(self.lastTranslation, in: self.view)
else if velocity.y < 0.0 // up
if uiviewTop > 100
self.uiview.center.y = (self.uiviewLastCenterPosition.y) + sender.translation(in: self.view).y
self.lastTranslation = sender.translation(in: self.view)
else
sender.setTranslation(self.lastTranslation, in: self.view)
break
case .ended:
self.uiviewLastCenterPosition = self.uiview.center
break
default:
break
当用户缓慢平移时,一切都完美无缺。但是当用户快速平移时,uiview 就超出了界限。
有人可以帮我解决这个问题吗?我想将视图完全移动到这些边界内。任何帮助将不胜感激。
【问题讨论】:
您必须在移动视图位置上设置条件,而不是速度。 @dahiya_boy 我已经在移动视图位置设置了两个条件。 Restrict the movement of subview inside superview bounds的可能重复 @GMHSJ 你找到解决方案了吗?有同样的问题。如果你解决了,请发表你的答案 @Bhavik 是的,我能够做到。将尽快将其发布为答案。 【参考方案1】:您应该在更改视图位置之前剪辑位置,在您的情况下为self.uiview.center.y
。寻找代码的变化。
@IBAction func supperViewPan(_ sender: UIPanGestureRecognizer)
switch sender.state
case .changed:
let viewTop = self.slideView.frame.origin.y
let viewBottom = self.slideView.frame.origin.y + self.slideView.frame.size.height
let halfHeight = self.slideView.frame.height / 2 // here
let velocity = sender.velocity(in: self.view)
if velocity.y > 0.0 // down
if viewBottom < 600
var displacedPosition = (self.uiviewLastCenterPosition.y) + sender.translation(in: self.view).y
// changes here
displacedPosition = displacedPosition > 600 - halfHeight ? 600 - halfHeight : displacedPosition
displacedPosition = displacedPosition < 100 + halfHeight ? 100 + halfHeight : displacedPosition
self.slideView.center.y = displacedPosition
self.lastTranslation = sender.translation(in: self.view)
else
sender.setTranslation(self.lastTranslation, in: self.view)
else if velocity.y < 0.0 // up
if viewTop > 100
var displacedPosition = (self.uiviewLastCenterPosition.y) + sender.translation(in: self.view).y
// changes here
displacedPosition = displacedPosition < 100 + halfHeight ? 100 + halfHeight : displacedPosition
displacedPosition = displacedPosition > 600 - halfHeight ? 600 - halfHeight : displacedPosition
self.slideView.center.y = displacedPosition
self.lastTranslation = sender.translation(in: self.view)
else
sender.setTranslation(self.lastTranslation, in: self.view)
break
case .ended:
self.uiviewLastCenterPosition = self.slideView.center
break
default:
break
【讨论】:
以上是关于使用平移手势在屏幕的有限区域中移动 UIView的主要内容,如果未能解决你的问题,请参考以下文章