如何覆盖iOS 11上的“从顶部滑动”手势?

时间:2018-08-05 14:03:11

标签: ios uigesturerecognizer swipe

我正在尝试覆盖iOS应用中的“从屏幕顶部向下滑动”手势(与打开通知中心的手势相同)。

据我所知,正确的方法是重写视图控制器上的preferredScreenEdgesDeferringSystemGestures()方法,并使用UIScreenEdgePanGestureRecognizer处理手势。

在我的情况下,默认系统手势已成功阻止(通知中心未打开,只有灰色指示器出现在屏幕顶部),但手势识别器未触发。这是视图控制器的代码:

class ViewController: UIViewController {

    override func preferredScreenEdgesDeferringSystemGestures() -> UIRectEdge {
        return .top
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let gestureRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(swipeFromTop))
        gestureRecognizer.edges = .top
        view.addGestureRecognizer(gestureRecognizer)
    }

    @objc func swipeFromTop() {
        print("swipe from top") // not printed
    }
}

我为“从屏幕底部向上滑动”手势尝试了相同的操作,并且按预期方式工作(未打开控制中心,并且触发了手势识别器)。

我正在运行iOS 11.4的iPhone 7上进行测试。

1 个答案:

答案 0 :(得分:1)

要执行“从顶部滑动”手势,您需要通过将UIViewController的{​​{3}}属性设置为返回true来隐藏状态栏。

如果您的UIViewController实例嵌入在UINavigationController中,则还需要通过将其prefersStatusBarHidden属性设置为true来隐藏导航栏。


以下Swift 5.1 / iOS 13代码示例展示了如何实现UIViewController子类以使从顶部手势开始的滑动有效:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationController?.isNavigationBarHidden = true

        let gestureRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(swipeFromTop))
        gestureRecognizer.edges = .top
        view.addGestureRecognizer(gestureRecognizer)
    }

    @objc func swipeFromTop() {
        print("swipe from top")
    }

    override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
        .top
    }

    override var prefersStatusBarHidden: Bool {
        true
    }

}

来源: