我的touchesBegan
中有一个AppDelegate
方法。我用它来检测状态栏中的水龙头。我在那里待了很长时间,效果很好。在iOS 13 Beta发布之前...
自从使用iOS 13 touchesBegan
以来,就不再停止调用它。我的应用程序中与手势相关的其他所有内容均未更改,AppDelegate
中的其他内容均未更改。除了在iOS 12中而不是在iOS 13中调用touchesBegan
之外,我实际上没有什么可做的。
尽管到目前为止还没有运气,所以如果有人遇到相同或相似的问题,我在这里分享。
更新:1
我发现以下一些半相关的问题,这些问题使我想到了Apple在iOS 13中新推出的UISceneDelegate。这些问题都不能解释为什么未调用touchesBegan
。到目前为止,据我所知UISceneDelegate
,我还没有找到为什么没有调用touchesBegan
的原因。
View controller responds to app delegate notifications in iOS 12 but not in iOS 13
How to detect touches in status bar
iOS13: how to detect a status bar click event?
答案 0 :(得分:1)
这就是我正在做的,可能不是很好,但到目前为止只能解决问题。很高兴进行改进。
此功能也可与SceneDelegate一起使用。
class ScrollToTopViewController: UITableViewController {
private let numberOfRow = 2
private let cellIdentifier = "empty"
override func viewDidLoad() {
super.viewDidLoad()
tableView.allowsSelection = false
tableView.separatorColor = .clear
tableView.backgroundColor = .clear
tableView.showsVerticalScrollIndicator = false
tableView.showsHorizontalScrollIndicator = false
tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)
view.autoresizingMask = []
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
scrollToBottom()
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return view.frame.size.height
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numberOfRow
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) ?? UITableViewCell()
cell.backgroundColor = .clear
return cell
}
override func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.scrollToBottom()
}
print("HANDLE SCROLL TO TOP")
return true
}
private func scrollToBottom() {
tableView.scrollToRow(at: IndexPath(row: numberOfRow - 1, section: 0), at: .bottom, animated: false)
}
}
private let scrollToTopVC = ScrollToTopViewController()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
NotificationCenter.default.addObserver(self,
selector: #selector(updateScrollToTopVC),
name: UIApplication.didChangeStatusBarFrameNotification,
object: nil)
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
updateScrollToTopVC()
}
@objc
private func updateScrollToTopVC() {
guard let viewController = window?.rootViewController else {
return
}
let statusBarFrame: CGRect
if #available(iOS 13.0, *) {
statusBarFrame = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? .zero
} else {
statusBarFrame = UIApplication.shared.statusBarFrame
}
scrollToTopVC.view.frame = statusBarFrame
viewController.addChild(scrollToTopVC)
viewController.view.addSubview(scrollToTopVC.view)
scrollToTopVC.didMove(toParent: viewController)
}
答案 1 :(得分:0)
我最近有同样的问题。我花了几个小时才弄清楚。 我在主窗口顶部创建了另一个UIWindow来显示应用程序通知/警报。由于某种原因,它在使用ios 13时会吃掉所有的触摸动作。我的解决方法是仅禁用最顶层的用户交互。但这意味着您显然无法与通知/警报进行任何用户交互。