mirror of
https://github.com/yattee/yattee.git
synced 2024-12-13 05:40:32 +05:30
43 lines
1.3 KiB
Swift
43 lines
1.3 KiB
Swift
|
// source: https://stackoverflow.com/a/65002837
|
||
|
|
||
|
import SwiftUI
|
||
|
|
||
|
// we need this workaround only for macOS
|
||
|
// this is the NSView that implements proper `wantsForwardedScrollEvents` method
|
||
|
final class VerticalScrollingFixHostingView<Content>: NSHostingView<Content> where Content: View {
|
||
|
override func wantsForwardedScrollEvents(for axis: NSEvent.GestureAxis) -> Bool {
|
||
|
axis == .vertical
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// this is the SwiftUI wrapper for our NSView
|
||
|
struct VerticalScrollingFixViewRepresentable<Content>: NSViewRepresentable where Content: View {
|
||
|
let content: Content
|
||
|
|
||
|
func makeNSView(context _: Context) -> NSHostingView<Content> {
|
||
|
VerticalScrollingFixHostingView<Content>(rootView: content)
|
||
|
}
|
||
|
|
||
|
func updateNSView(_: NSHostingView<Content>, context _: Context) {}
|
||
|
}
|
||
|
|
||
|
// this is the SwiftUI wrapper that makes it easy to insert the view
|
||
|
// into the existing SwiftUI view builders structure
|
||
|
struct VerticalScrollingFixWrapper<Content>: View where Content: View {
|
||
|
let content: () -> Content
|
||
|
|
||
|
init(@ViewBuilder content: @escaping () -> Content) {
|
||
|
self.content = content
|
||
|
}
|
||
|
|
||
|
var body: some View {
|
||
|
VerticalScrollingFixViewRepresentable(content: self.content())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
extension View {
|
||
|
@ViewBuilder func workaroundForVerticalScrollingBug() -> some View {
|
||
|
VerticalScrollingFixWrapper { self }
|
||
|
}
|
||
|
}
|