Skip to content

Instantly share code, notes, and snippets.

@JunyuKuang
Last active September 26, 2023 05:17
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JunyuKuang/75fcb81fd6046c0bf31933d85043d04b to your computer and use it in GitHub Desktop.
Save JunyuKuang/75fcb81fd6046c0bf31933d85043d04b to your computer and use it in GitHub Desktop.
Disable 77% scaling for Mac Catalyst apps. (Swift)
let overrideCatalystScaleFactor: Void = {
guard let sceneViewClass = NSClassFromString("UINSSceneView") as? NSObject.Type else {
return
}
if sceneViewClass.instancesRespond(to: NSSelectorFromString("scaleFactor")) {
// old
swizzleInstanceMethod(
class: sceneViewClass,
originalSelector: NSSelectorFromString("scaleFactor"),
swizzledSelector: #selector(swizzle_scaleFactor)
)
} else {
// macOS 11.3 Beta 3+
swizzleInstanceMethod(
class: sceneViewClass,
originalSelector: NSSelectorFromString("sceneToSceneViewScaleFactor"),
swizzledSelector: #selector(swizzle_scaleFactor)
)
swizzleInstanceMethod(
class: sceneViewClass,
originalSelector: NSSelectorFromString("fixedSceneToSceneViewScaleFactor"),
swizzledSelector: #selector(swizzle_scaleFactor2)
)
swizzleInstanceMethod(
class: NSClassFromString("UINSSceneContainerView"),
originalSelector: NSSelectorFromString("sceneToSceneViewScaleForLayout"),
swizzledSelector: #selector(swizzle_scaleFactor3)
)
}
}()
@objc private extension NSObject {
func swizzle_scaleFactor() -> CGFloat { 1 }
func swizzle_scaleFactor2() -> CGFloat { 1 }
func swizzle_scaleFactor3() -> CGFloat { 1 }
}
@JunyuKuang
Copy link
Author

For implementation of swizzleInstanceMethod, check Swizzle.swift

@Janneman84
Copy link

Janneman84 commented Sep 16, 2023

Thanks works well overall but I have an issue:

When picking a photo using UIImagePickerController or PHPickerViewController the touches/clicks are not registered correctly. It's probably best to have the picker stick to the default 77% scaling. Any tips on how to do this?

@JunyuKuang
Copy link
Author

@Janneman84 you could:
A. open those remote view controllers on a separated window scene, where scaling is set to 77% (requires modification on the swizzled methods);
or B. replace PHPickerViewController with a macOS equivalent such as UIDocumentPickerViewController or NSOpenPanel.

@Janneman84
Copy link

Thanks for the tip!

I figured out image pickers are pretty useless in MacOS anyway. A document picker works much better!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment