如何允许在某个区域拖动 UIView (PanGesture ..)

Posted

技术标签:

【中文标题】如何允许在某个区域拖动 UIView (PanGesture ..)【英文标题】:How to allow drag UIView (PanGesture..) just in some area 【发布时间】:2015-08-13 14:57:50 【问题描述】:

我需要通过PanGestureRecognizer 拖动 UIView(我知道该怎么做),但我不知道如何限制它。需要从顶部进行一些填充,并且如果与四个侧面之一(左侧,右侧,顶部(这里是填充)和设备底部)发生碰撞,请停止拖动并且您不能超过 - 或者像顶部一样的 1px 填充, 任何。 :)

我试过这个:https://github.com/andreamazz/UIView-draggable 但如果我通过 cagingArea 设置限制区域,iPad (Air) 会滞后。移动也不顺畅,我认为原生的 PanGestureRecognizer 最好,只需要限制区域,请问您知道我该怎么做吗? :)

我正在用 Swift 写作。并且还找到了一些相关的话题,比如这个 -> Use UIPanGestureRecognizer to drag UIView inside limited area 但我不知道insideDraggableArea 在做什么?..

非常感谢程序员

【问题讨论】:

链接已被编辑,它检查被拖动的视图是否在某些范围内。女巫在你的情况下,填充顶部,左侧......等等。static func insideDraggableArea(point : CGPoint) -> Bool return point.x > 50 && point.x < 200 && point.y > 20 && point.y < 400 谢谢 Lucho,这个例子现在可以工作了,没用。滞后了这么多。我正在尝试我的 iPad Air。我想,那是因为每一帧代码都会检查所有的位置和条件,对吧?我需要找到一些正常工作的顺利解决方案。 【参考方案1】:

我在项目中遇到的同样问题, 试试这个,

1) 初始化 PanGesture

let panRec = UIPanGestureRecognizer()

2) 将 PanGesture 添加到您的 UIView

override func viewDidLoad() 
....
....
panRec.addTarget(self, action: "draggedView:")
yourview.addGestureRecognizer(panRec)
yourview.userInteractionEnabled = true
....
....

3) 设置您对 draggedView 功能的限制

func draggedView(sender:UIPanGestureRecognizer)
        println("panning")

        var translation = sender.translationInView(self.view)

        println("the translation x:\(translation.x) & y:\(translation.y)")

        //sender.view.
        var tmp=sender.view?.center.x  //x translation
        var tmp1=sender.view?.center.y //y translation

        //set limitation for x and y origin
        if(translation.x <= 100 && translation.y <= 50 )
         
        sender.view?.center=CGPointMake(tmp!+translation.x, tmp1!+translation.y)
         sender.setTranslation(CGPointZero, inView: self.view)
         

【讨论】:

伙计,谢谢你,但你的例子不起作用。那个,在我关于另一个主题的帖子中的链接中,很好,并且从代码方面运行良好。但在真实设备上它没有用。那里有很多滞后,因为应用程序的每一帧都会重新计算 if 条件,如果限制和可拖动视图之间存在冲突。 :/ 任何人都知道,如何使它顺利和有用的生产构建?谢谢! 嗨 Vlastimil,首先在 draggedView func 中设置正确的限制,然后检查 else remove if(translation.x 伙计们,你能录制视频吗?因为用我的iPad不好。 :( @VlastimilFiser,您能说明一下您在 iPad 上遇到的问题吗 @ManikandanD 是的,这个(视频中的内容)运行良好,因为有翻译检查。但是,如果我需要允许在某个区域正常拖动(所有方向,无限制),并且如果与区域边界发生碰撞(当然可以通过代码中的数字指定,无论如何),则需要停止可拖动元素。但是必须允许可拖动元素拖回正确的区域。【参考方案2】:

你必须使用 UIPanGestureRecognizer 吗? 将视图添加到视图控制器并检查启用的用户交互。 我认为您应该标记视图并使用 touchesMoved 方法。

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) 

    if let touch = touches.first as? UITouch 
        if touch.view.tag == 2 
            if self.yourView.center.y <= CGFloat(230)  //if you want use limitation drag

                var touchLocation = touch.locationInView(self.view)
                self.yourView.center.y = touchLocation.y
                self.yourView.center.x = touchLocation.x
           
        
    

【讨论】:

嗨,纳希特,谢谢。这个不适合我。我已经为我正在拖动的视图设置标签等,但没有任何反应。 抱歉自动完成问题,我希望这应该可以工作 它的滞后,添加条件后【参考方案3】:

这对我有用:

guard let view = UIApplication.shared.windows.last else  return 
view.addSubview(customView)

【讨论】:

以上是关于如何允许在某个区域拖动 UIView (PanGesture ..)的主要内容,如果未能解决你的问题,请参考以下文章

如何拖动 UIView 元素并更改位置?

在 UIView 动画期间难以允许用户交互

如何在 UITableView 弹跳区域下方编辑或添加 UIView(顶部)?像 Twitter 的 - 更新等

使用 IF 语句设置 UIView 的位置

在滚动视图中拖动 uiview

UIView里面的UIView,拖动显示内容