在Apple的文档中,我没有找到任何与swiftUI摇动有关的手势。那么如何检测呢?
我对快速编程非常陌生,这个问题使我困扰了很长时间。
在UIKit中,如果我要检测晃动手势,则非常简单直接。在swiftUI中,有一堆手势,例如点击拖动旋转,但是我在官方文档或任何询问的人中找不到摇动手势。 swiftUI是否有可能达到相同的结果?或者他们只是忘记将其添加到swiftUI框架中...
如果在swiftUI中无法实现,那我该如何将UIKit中的motionEnded函数导入要检测震动的swiftUI视图中?
答案 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)
我使用%
视图内的视图控制器来完成这项工作。
对应的UIViewControllerRepresentable
和UIViewControllerRepresentable
:
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