Fix scrolling of favorites on macOS Big Sur

This commit is contained in:
Arkadiusz Fal 2021-12-02 20:19:10 +01:00
parent cc2bf90218
commit c4b5c7ce41
2 changed files with 45 additions and 0 deletions

View File

@ -29,6 +29,9 @@ struct FavoritesView: View {
#else
ForEach(favorites) { item in
FavoriteItemView(item: item, dragging: $dragging)
#if os(macOS)
.workaroundForVerticalScrollingBug()
#endif
}
#endif
}

View File

@ -0,0 +1,42 @@
// 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 }
}
}