ios 在边界外应用UIPanGestureRecognizer

mlmc2os5  于 2023-05-30  发布在  iOS
关注(0)|答案(1)|浏览(104)

我希望允许用户将黄色方块UIView添加到UIScrollView,然后拖放和缩放用户创建的黄色方块。
我知道要启用此功能,我需要创建一个辅助视图,比如yellowSquareContainerView,然后按如下所示设置:

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return yellowSquareContainerView
}

我将黄色方块添加到这个容器视图中。
然而,这种方法的主要问题是,如果用户将方块移动到yellowSquareContainerView的边界之外,则添加到黄色UIView的UIPanGestureRecognizer将不起作用(这是一个完全有效的用例)。
当黄色方块在容器视图的边界之外时,如何让UIPanGestureRecognizer工作?

qeeaahzv

qeeaahzv1#

经过一番研究,我找到了一种将视图平移到其父视图边界之外的方法。它涉及覆盖父视图的point函数。
在内部,视图使用它的point函数来确定是否应该允许一个事件(如触摸或平移)。默认情况下,点检查事件是否在视图的边界内开始。这就是为什么您可以平移其父视图之外的视图,但不能平移其父视图之后的视图。通过将point重写为always return true,该手势总是被允许的。
以下是步骤:
1.创建UIView的子类
1.重写point(inside:with:)以始终返回true
1.使你的容器视图成为这个子类的成员
下面是一个示例子类:

class ContainerView: UIView {
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        return true
    }
}

下面是一些示例代码:

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let containerView = ContainerView(frame: CGRect(x: 100, y: 300, width: 200, height: 200))
        containerView.backgroundColor = .green
        view.addSubview(containerView)
        
        let yellowSquareView = UIView(frame: CGRect(x: 40, y: 40, width: 80, height: 80))
        yellowSquareView.backgroundColor = .yellow
        containerView.addSubview(yellowSquareView)

        let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
        yellowSquareView.addGestureRecognizer(pan)
    }
        
    @objc private func handlePan(recognizer: UIPanGestureRecognizer) {
        if let pannedView = recognizer.view {
            let translation = recognizer.translation(in: view)
            pannedView.center = CGPoint(x: pannedView.center.x + translation.x,
                                        y: pannedView.center.y + translation.y)
            recognizer.setTranslation(.zero, in: view)
        }
    }
}

相关问题