使用平移手势在屏幕的有限区域中移动 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的主要内容,如果未能解决你的问题,请参考以下文章

无法在其父视图之外平移手势较小的 UIView

如果检测到超出范围,则禁用平移手势

UIView/Drawer 使用平移/滑动手势

不使用 UIScrollview 缩放 UIView

当翻译显示在标签中时,查看平移手势停止 - Xcode

仅从 1 个子视图平移 UIView