Skip to content

Instantly share code, notes, and snippets.

@0xstragner
Last active October 20, 2022 15:39
Show Gist options
  • Save 0xstragner/818812a04017aa3da34a9dcfdca0b2f4 to your computer and use it in GitHub Desktop.
Save 0xstragner/818812a04017aa3da34a9dcfdca0b2f4 to your computer and use it in GitHub Desktop.
Medium/UISheetPresentationController/3.m
typedef NSString *SASheetPresentationControllerDetendIdentifier NS_TYPED_EXTENSIBLE_ENUM
API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
UIKIT_EXTERN const SASheetPresentationControllerDetendIdentifier SASheetPresentationControllerDetentIdentifierMaximum
API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
UIKIT_EXTERN const SASheetPresentationControllerDetendIdentifier SASheetPresentationControllerDetentIdentifierLarge
API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
UIKIT_EXTERN const SASheetPresentationControllerDetendIdentifier SASheetPresentationControllerDetentIdentifierMedium
API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
UIKIT_EXTERN const SUISheetPresentationControllerDetendIdentifier SASheetPresentationControllerDetentIdentifierSmall
API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
typedef CGFloat (^SASheetDetentResulutionBlock)(UIView *containerView, CGRect availableCoordinateSpace);
API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos) NS_SWIFT_UI_ACTOR
@interface SUISheetPresentationControllerDetent : NSObject
+ (instancetype)detentWithIdentifier:(SASheetPresentationControllerDetendIdentifier)identifier
resolutionBlock:(SASheetDetentResulutionBlock)resolutionBlock;
+ (instancetype)largeDetent;
+ (instancetype)mediumDetent;
+ (instancetype)smallDetent;
@end
static Class kSA13SheetPresentationControllerDetentClass = nil;
const SASheetPresentationControllerDetendIdentifier SASheetPresentationControllerDetentIdentifierMaximum = @"com.apple.UIKit.maximum";
const SASheetPresentationControllerDetendIdentifier SASheetPresentationControllerDetentIdentifierLarge = @"com.apple.UIKit.large";
const SASheetPresentationControllerDetendIdentifier SASheetPresentationControllerDetentIdentifierMedium = @"com.apple.UIKit.medium";
const SASheetPresentationControllerDetendIdentifier SASheetPresentationControllerDetentIdentifierSmall = @"com.apple.UIKit.small";
@interface SASheetPresentationControllerDetent ()
@property (nonatomic, copy) SASheetPresentationControllerDetendIdentifier identifier;
@property (nonatomic, copy) SASheetDetentResulutionBlock resulutionBlock;
@property (nonatomic, strong) id presentationControllerDetent;
@end
@implementation SASheetPresentationControllerDetent
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
kSA13SheetPresentationControllerDetentClass = NSClassFromString(@"_UISheetDetent");
});
}
- (instancetype)initWithPresentationControllerDetent:(id)presentationControllerDetent
identifier:(SASheetPresentationControllerDetendIdentifier)identifier
resulutionBlock:(SASheetDetentResulutionBlock _Nullable)resulutionBlock
{
self = [super init];
if (self != nil) {
_identifier = [identifier copy];
_resulutionBlock = [resulutionBlock copy];
_presentationControllerDetent = presentationControllerDetent;
}
return self;
}
+ (instancetype)detentWithIdentifier:(SUISheetPresentationControllerDetendIdentifier)identifier
resolutionBlock:(SUISheetDetentResulutionBlock)resolutionBlock
{
id presentationControllerDetent = nil;
if (@available(iOS 15, *)) {
Class klass = [UISheetPresentationControllerDetent class];
presentationControllerDetent = [[klass alloc] init];
} else {
presentationControllerDetent = [[kSA13SheetPresentationControllerDetentClass alloc] initWithInternalBlock:resolutionBlock];
}
return [[SASheetPresentationControllerDetent alloc] initWithPresentationControllerDetent:presentationControllerDetent
identifier:identifier
resulutionBlock:resolutionBlock];
}
+ (instancetype)largeDetent {
id presentationControllerDetent = nil;
if (@available(iOS 15, *)) {
presentationControllerDetent = [UISheetPresentationControllerDetent largeDetent];
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
SEL sel = NSSelectorFromString(@"_largeDetent");
presentationControllerDetent = [kSA13SheetPresentationControllerDetentClass performSelector:sel];
#pragma clang diagnostic pop
}
return [[SUISheetPresentationControllerDetent alloc] initWithPresentationControllerDetent:presentationControllerDetent
identifier:SUISheetPresentationControllerDetentIdentifierLarge
resulutionBlock:nil];
}
+ (instancetype)mediumDetent {
id presentationControllerDetent = nil;
if (@available(iOS 15, *)) {
presentationControllerDetent = [UISheetPresentationControllerDetent mediumDetent];
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
SEL sel = NSSelectorFromString(@"_mediumDetent");
presentationControllerDetent = [kSA13SheetPresentationControllerDetentClass performSelector:sel];
#pragma clang diagnostic pop
}
return [[SASheetPresentationControllerDetent alloc] initWithPresentationControllerDetent:presentationControllerDetent
identifier:SUISheetPresentationControllerDetentIdentifierMedium
resulutionBlock:nil];
}
+ (instancetype)smallDetent
{
return [self detentWithIdentifier:SUISheetPresentationControllerDetentIdentifierSmall
resolutionBlock:^CGFloat (UIView *containerView, CGRect frame) {
return 121.0f;
}];
}
#pragma mark -
- (id)forwardingTargetForSelector:(SEL)aSelector
{
return self.presentationControllerDetent;
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment