Skip to content

Instantly share code, notes, and snippets.

@dezinezync
Last active August 18, 2023 13:31
Show Gist options
  • Save dezinezync/2e40dba29986401f393a51134441c53e to your computer and use it in GitHub Desktop.
Save dezinezync/2e40dba29986401f393a51134441c53e to your computer and use it in GitHub Desktop.
UISlider crashes the app when used in a Mac Catalyst app. Also applies to AVPlayerViewController. This category swizzles the methods with blank implementations.
//
// UISlider+MacCatalyst.m
// Elytra
//
// Created by Nikhil Nigade on 30/09/20.
//
/**
* USE AT YOUR OWN RISK!
* The only downside of using this category is that you end up with a slider with a comically larger tracking button.
*
* Please read this thread before Swizzling Apple Framework methods:
* https://stackoverflow.com/questions/5339276/what-are-the-dangers-of-method-swizzling-in-objective-c/8636521
*/
#import "UISlider+MacCatalyst.h"
#import "NSObject+SimpleSwizzle.h"
@implementation UISlider (MacCatalyst)
#if TARGET_OS_MACCATALYST
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SEL originalSelector = NSSelectorFromString(@"setMinimumTrackImage:forState:");
SEL swizzeledSelector = NSSelectorFromString(@"dz_setMinimumTrackImage:forState:");
[self swizzleSelector:originalSelector withSelector:swizzeledSelector];
originalSelector = NSSelectorFromString(@"setMaximumTrackImage:forState:");
swizzeledSelector = NSSelectorFromString(@"dz_setMaximumTrackImage:forState:");
[self swizzleSelector:originalSelector withSelector:swizzeledSelector];
originalSelector = NSSelectorFromString(@"setThumbImage:forState:");
swizzeledSelector = NSSelectorFromString(@"dz_setThumbImage:forState:");
[self swizzleSelector:originalSelector withSelector:swizzeledSelector];
originalSelector = NSSelectorFromString(@"setMaximumTrackImage:forStates:");
swizzeledSelector = NSSelectorFromString(@"dz_setMaximumTrackImage:forStates:");
[self swizzleSelector:originalSelector withSelector:swizzeledSelector];
});
}
#pragma mark -
/**
* The following implementations are left blank on purpose.
* Calling them in MacCatalyst will crash the app because
* Apple removed support for them in Xcode 12.2 Beta 1.
* Crashing as of 30/09/2020.
*/
- (void)dz_setMinimumTrackImage:(id)image forState:(int)state {}
- (void)dz_setMaximumTrackImage:(id)image forState:(int)state {}
- (void)dz_setThumbImage:(id)image forState:(int)state {}
- (void)dz_setMaximumTrackImage:(id)image forStates:(int)state {}
#endif
@end
@applefanbois
Copy link

crApple love to break everything and makes you regret not using GTK.

They removed all the abilities to customized a UISlider.
You can't change the look of a UISlider on MacCatalyst.
You cannot even hide the track bar or change its colour.
The track bar is a dumb VGA blue and we are stuck with it.

The only way now is to make your own slider from scratch.

Since the arrival of Mac M1, macOS is becoming more and more broken.
Their SDK is becoming unusable with : keyboard events that do not work in WKWebview, many crashes, Keyboard events that do not trigger anymore, functions that they remove but never give a replacement for that basic feature.

They also confused everyone with SwiftUI that is only 10% of UIKit.

crApple is accelerating the migration toward web only.
crApple is killing app in favour of going full web.

Good luck everyone, don't forget to turn the light off on your way out.

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