【问题标题】:How to override the "swipe from top" gesture on iOS 11?如何覆盖 iOS 11 上的“从顶部滑动”手势?
【发布时间】:2018-08-05 14:03:10
【问题描述】:

我正在尝试在我的 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 上进行测试。

【问题讨论】:

  • 您可以实现gestureRecognizer 的委托回调来调试正在发生的事情 - 例如如果它收到触摸,如果它“开始”,如果它失败。
  • @DisableR 感谢您的想法,我尝试实现here 中描述的所有委托方法,但没有一个被调用。
  • 你的ViewController在导航控制器里面吗?
  • @DisableR 不,它只是UIWindow 中的UIViewController(您使用“单一视图应用程序”获得的默认设置)
  • 我刚刚创建了“单一视图”项目并添加了您的代码 - 如果我开始在状态栏下方滑动一点,则会调用 iPhone 8 Plus 模拟器 swipeFromTop

标签: ios uigesturerecognizer swipe


【解决方案1】:

要使“从顶部滑动”手势起作用,您需要通过将UIViewControllerprefersStatusBarHidden 属性设置为返回true 来隐藏状态栏。

如果您的UIViewController 实例嵌入在UINavigationController 中,您还需要通过将其isNavigationBarHidden 属性设置为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
    }

}

来源:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多