如何在swiftUI中检测摇动手势

时间:2019-10-24 21:08:14

标签: uikit swiftui

在Apple的文档中,我没有找到任何与swiftUI摇动有关的手势。那么如何检测呢?

我对快速编程非常陌生,这个问题使我困扰了很长时间。

在UIKit中,如果我要检测晃动手势,则非常简单直接。在swiftUI中,有一堆手势,例如点击拖动旋转,但是我在官方文档或任何询问的人中找不到摇动手势。 swiftUI是否有可能达到相同的结果?或者他们只是忘记将其添加到swiftUI框架中...

如果在swiftUI中无法实现,那我该如何将UIKit中的motionEnded函数导入要检测震动的swiftUI视图中?

5 个答案:

答案 0 :(得分:7)

您可以添加新的通知并在扩展名中覆盖UIWindow.motionEnded(如先前的回答中所述):

extension NSNotification.Name {
    public static let deviceDidShakeNotification = NSNotification.Name("MyDeviceDidShakeNotification")
}

extension UIWindow {
    open override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
        super.motionEnded(motion, with: event)
        NotificationCenter.default.post(name: .deviceDidShakeNotification, object: event)
    }
}

有了这个,您就可以轻松地在您的视图中订阅通知:

struct Example: View {
    @State private var message = "Unshaken"

    var body: some View {
        Text(message)
            .onReceive(NotificationCenter.default.publisher(for: .deviceDidShakeNotification)) { _ in
                self.message = "Shaken, not stirred."
        }
    }
}

答案 1 :(得分:0)

您可以从ViewController级别执行此操作。例如:

final class MyVC: UIHostingController<ContentView> {

    override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
        guard motion == .motionShake else { return }

        // Notify view.
    }
}

答案 2 :(得分:0)

我使用%视图内的视图控制器来完成这项工作。

对应的UIViewControllerRepresentableUIViewControllerRepresentable

UIViewController

如何实施:

struct ShakableViewRepresentable: UIViewControllerRepresentable {

    func makeUIViewController(context: Context) -> ShakableViewController {
        ShakableViewController()
    }
    func updateUIViewController(_ uiViewController: ShakableViewController, context: Context) {}
}


class ShakableViewController: UIViewController {

    override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
        guard motion == .motionShake else { return }

        /* Do something */
        print("Shaken")
    }
}

答案 3 :(得分:0)

iOS 13,Swift 5 ...基于jk2K的答案与SwiftUI一起使用的解决方案,显然,它位于ContentView.swift文件中。

let messagePublisher = PassthroughSubject<String, Never>()

class ContentMode {

...

}

extension UIWindow {
 open override func motionEnded(_ motion: UIEvent.EventSubtype, with event:   UIEvent?) {
    if motion == .motionShake {
        print("Device shaken")
        messagePublisher.send("Stop Shaking Me")
    }
  }
}

您可以使用它在您的UI中将其拾取

.onReceive(messagePublisher) { (message) in
  // message = "Stop Shaking Me"
}

答案 4 :(得分:0)

这是对上面带有视图修改器的改进。

UPDATE public.foo SET newlog = log::TIMESTAMPTZ