Skip to content

Instantly share code, notes, and snippets.

@nonstriater
Forked from joshhudnall/UIAlertViewCrashFix.h
Last active August 29, 2015 14:26
Show Gist options
  • Save nonstriater/8625918b2f7d37a34196 to your computer and use it in GitHub Desktop.
Save nonstriater/8625918b2f7d37a34196 to your computer and use it in GitHub Desktop.
A potential fix to a new crash in iOS 8.3 where UIAlertViews will crash because they expect a different auto rotation behavior than what they are getting.
//
// UIAlertViewCrashFix.h
//
// Created by Josh Hudnall on 4/28/15.
//
//
#import <Foundation/Foundation.h>
@interface UIAlertController (CrashFix)
@end
@interface UIViewController (CrashFix)
@end
//
// UIAlertViewCrashFix.m
//
// Created by Josh Hudnall on 4/28/15.
//
//
#import <objc/runtime.h>
#import "UIAlertView+CrashFix.h"
@implementation UIAlertController (CrashFix)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
Method original, swizzle;
// Swizzle
original = class_getInstanceMethod(class, @selector(shouldAutorotate));
swizzle = class_getInstanceMethod(class, @selector(jh_shouldAutorotate));
method_exchangeImplementations(original, swizzle);
// Swizzle
original = class_getInstanceMethod(class, @selector(supportedInterfaceOrientations));
swizzle = class_getInstanceMethod(class, @selector(jh_supportedInterfaceOrientations));
method_exchangeImplementations(original, swizzle);
// Swizzle
original = class_getInstanceMethod(class, @selector(preferredInterfaceOrientationForPresentation));
swizzle = class_getInstanceMethod(class, @selector(jh_preferredInterfaceOrientationForPresentation));
method_exchangeImplementations(original, swizzle);
});
}
- (BOOL)jh_shouldAutorotate {
return IS_IPAD;
}
- (NSUInteger)jh_supportedInterfaceOrientations {
return (IS_IPAD) ? UIInterfaceOrientationMaskAll : UIInterfaceOrientationPortrait;
}
- (UIInterfaceOrientation)jh_preferredInterfaceOrientationForPresentation {
UIDevice* device = [UIDevice currentDevice];
if (device.orientation == UIInterfaceOrientationPortraitUpsideDown) {
return UIInterfaceOrientationPortraitUpsideDown;
}
return UIInterfaceOrientationPortrait;
}
@end
@implementation UIViewController (CrashFix)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
Method original, swizzle;
// Swizzle
original = class_getInstanceMethod(class, @selector(shouldAutorotate));
swizzle = class_getInstanceMethod(class, @selector(jh_shouldAutorotate));
method_exchangeImplementations(original, swizzle);
// Swizzle
original = class_getInstanceMethod(class, @selector(supportedInterfaceOrientations));
swizzle = class_getInstanceMethod(class, @selector(jh_supportedInterfaceOrientations));
method_exchangeImplementations(original, swizzle);
// Swizzle
original = class_getInstanceMethod(class, @selector(preferredInterfaceOrientationForPresentation));
swizzle = class_getInstanceMethod(class, @selector(jh_preferredInterfaceOrientationForPresentation));
method_exchangeImplementations(original, swizzle);
});
}
- (BOOL)jh_shouldAutorotate {
return IS_IPAD;
}
- (NSUInteger)jh_supportedInterfaceOrientations {
return (IS_IPAD) ? UIInterfaceOrientationMaskAll : UIInterfaceOrientationPortrait;
}
- (UIInterfaceOrientation)jh_preferredInterfaceOrientationForPresentation {
UIDevice* device = [UIDevice currentDevice];
if (device.orientation == UIInterfaceOrientationPortraitUpsideDown) {
return UIInterfaceOrientationPortraitUpsideDown;
}
return UIInterfaceOrientationPortrait;
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment