我正在尝试覆盖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上进行测试。
答案 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
}
}
来源: