半天没找到 SwiftUI MacOS 下鼠标滚轮事件的文档,兼容实现方式一点都不 Swift 。。

2021-06-10 23:53:49 +08:00
 Smash

今天花了 2 个小时,看完了 Swift 的基本语法,然后准备写个 MacOS 的图片查看器做练习。

我的开发机版本 10.15.7 Catalina,只能用 1.0 的 SwiftUI 。

需求是我想在 Image 对象上监听滑轮滚动,然后对图片进行缩放处理,结果发现一堆手势都有回调函数,但是就是没有 wheelScroll 的回调函数。

最后,搜索了半天,StackOverflow 给出的写法是这样的

        Image("1")
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(alignment: .center)
            .onAppear {
                NSEvent.addLocalMonitorForEvents(matching: [.scrollWheel]) {
                    print("mouse: \($0.scrollingDeltaX) \($0.scrollingDeltaY)")
                    return $0
                }
            }

我想说,这一点都不 Swift,一点都不声明式。

所以,有更优的解法吗?

还是说 SwiftUI 现在写 MacOS 的 App 纯属就是个玩具?

1617 次点击
所在节点    Swift
6 条回复
ysc3839
2021-06-11 00:07:35 +08:00
我不懂 macOS 开发,以下仅仅是我个人非常浅薄的认识:
以前简单翻过一个用 Swift 开发的 app 代码,它没有使用 xib 或 storyboard 来写界面,而是直接代码创建 NSWindow 等等。
现在来看 SwiftUI,感觉就是对 NSXxx 那些控件包装了一层而已,可能最大的意义是统一 NSXxx 和 UIXxx 。
Smash
2021-06-11 00:16:26 +08:00
StackOverflow 上有人跟我遇到一样的问题,1 个月前的提问,只有一个人回复让他用 AppKit 来写,😥。。
vtoexOwner
2021-06-13 20:44:03 +08:00
苹果系列没有有滚轮的鼠标吧,你要找的这个事件是不是根本就不存在 ?😂
我想你可能要找那种捏合手势的回调吧
Smash
2021-06-13 20:46:31 +08:00
@vtoexOwner 已经放弃 SwiftUI 了,还是用 Storyboard 来实现的,NSImageView 默认有 onWheelScroll 回调。
Smash
2021-06-13 20:48:03 +08:00
@vtoexOwner SwiftUI 写界面是真的快,可惜现在我觉得还不够完善。很多 MacOS 的能力都没有很好的接口调用,最后还是要用 SwiftUI+Appkit 来写,我不如直接 Appkit 写了。
vtoexOwner
2021-06-13 21:15:05 +08:00
@Smash 是的, 昨天开始看了一天教程,今天试着撸了一下,感觉做基本的 UI 确实舒服,不必考虑一些回调、刷新问题,但问题也很多,一些 UIKit 框架中有的接口在这里都是没有了,比如说 textField 的清除按钮,查了下竟然是要自定义的……结合你的问题,在 macos 上应该也是存在相同的问题
总体来说,除非是要同时做 macos 和 ios,不然不建议用 SwiftUI

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/782775

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX