SwiftyCrop icon indicating copy to clipboard operation
SwiftyCrop copied to clipboard

add support for macOS

Open navanchauhan opened this issue 1 year ago • 8 comments

  • Adds internal typealias PlatformImage that uses UIKit or AppKit depending on what it can import
  • Correctly applies UIKit/AppKit function
  • Adds support for macOS to the demo (tested as well)

Theoretically, magnification and rotation should work on macOS but doesn't for some reason (and doesn't throw any errors either). I might update both gesture to their newer counterparts

navanchauhan avatar Aug 13 '24 06:08 navanchauhan

Welp. This is randomly working/not-working. I need to investigate a bit more

navanchauhan avatar Aug 13 '24 07:08 navanchauhan

I think the issue of sometimes working is already addressed in the README and was discussed in #13

Two solutions I have come up with to enable zoom on macOS:

  • Manual scroll wheel event handler
    private func handleScrollEvent(_ event: NSEvent) {        
        let currentTime = Date()
        let timeDifference = currentTime.timeIntervalSince(lastScrollTime)
        
        if timeDifference > 0.1 {
            scrollMagnitude = 0
        }
        
        scrollMagnitude += event.deltaY
        
        let scaleFactor: CGFloat = 1 + (scrollMagnitude * 0.001)
        handleMagnification(value: MagnificationGesture.Value(scaleFactor))
        
        viewModel.lastScale = viewModel.scale
        viewModel.lastOffset = viewModel.offset
        
        lastScrollTime = currentTime
    }
  • Add Command + and Command - shortcut
    private func handleKeyEvent(_ event: NSEvent) {
        if event.modifierFlags.contains(.command) {
            switch event.keyCode {
            case 24: // Command +
                handleMagnification(value: MagnificationGesture.Value(1.1))
                viewModel.lastScale = viewModel.scale
                viewModel.lastOffset = viewModel.offset
            case 27: // Command -
                handleMagnification(value: MagnificationGesture.Value(0.9))
                viewModel.lastScale = viewModel.scale
                viewModel.lastOffset = viewModel.offset
            default:
                break
            }
        }
    }

navanchauhan avatar Aug 14 '24 07:08 navanchauhan

Thanks for the PR and effort @navanchauhan! I've been pretty busy these past days but I will take a detailed look at your code and test it soon!

benedom avatar Aug 14 '24 09:08 benedom

@navanchauhan I have another suggestion how to solve the zooming issue on Mac:

  • Maybe showing buttons (e.g. "+" and "-") when cropping an image to zoom accordingly is easiest.

Especially since it is intuitive. As a user I might not be familiar with the cmd option and also not have a mouse wheel. This might be the easiest solution to the issue. What do you think?

benedom avatar Aug 14 '24 09:08 benedom

That is a really good suggestion. While I am at it, I might even add buttons for rotating the image

navanchauhan avatar Aug 20 '24 06:08 navanchauhan

I was able to fix the issue where the circular crop was not working properly on macOS. Now, I just need to add buttons and clean up the code a bit.

I should have time this next week (or this weekend itself) to clean up and commit

navanchauhan avatar Aug 31 '24 06:08 navanchauhan

@navanchauhan hey it's been a while 😅 any update on your behalf for this issue?

benedom avatar Jun 03 '25 08:06 benedom