#import #import "AutoGrid.h" @interface ViewController : UIViewController { AutoGrid *autoGrid; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self loadStuff]; NSMutableArray *names = [NSMutableArray array]; for (int i = 0; i < 100; i++) [names addObject:[NSString stringWithFormat:@"Some Dylib %d", i]]; NSMutableArray *views = [NSMutableArray array]; for (NSString *name in names) { UILabel *label = [[UILabel alloc] init]; label.text = name; [views addObject:label]; } [autoGrid setViews:views]; } #define EXPLANATION \ @"SpringBoard seems to have crashed. The cause might be a Substitute jailbreak extension, or unrelated. Just to be safe, extensions in SpringBoard have been temporarily disabled. You can continue in this mode, or restart SpringBoard normally.\n\nThe following extensions were running:" static void hugging(UIView *view, UILayoutPriority pri) { [view setContentHuggingPriority:pri forAxis:UILayoutConstraintAxisHorizontal]; [view setContentHuggingPriority:pri forAxis:UILayoutConstraintAxisVertical]; } static void compression(UIView *view, UILayoutPriority pri) { [view setContentCompressionResistancePriority:pri forAxis:UILayoutConstraintAxisHorizontal]; [view setContentCompressionResistancePriority:pri forAxis:UILayoutConstraintAxisVertical]; } - (void)loadStuff { self.view.backgroundColor = [UIColor whiteColor]; UILabel *top = [[UILabel alloc] init]; top.translatesAutoresizingMaskIntoConstraints = NO; top.textAlignment = NSTextAlignmentCenter; hugging(top, 251); top.text = @"libsubstitute"; top.font = [UIFont systemFontOfSize:23]; [self.view addSubview:top]; UILabel *big = [[UILabel alloc] init]; big.translatesAutoresizingMaskIntoConstraints = NO; big.textAlignment = NSTextAlignmentCenter; hugging(big, 251); [big setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisHorizontal]; [big setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisVertical]; big.text = @"Safe Mode"; big.font = [UIFont systemFontOfSize:32]; [self.view addSubview:big]; UILabel *explain = [[UILabel alloc] init]; explain.translatesAutoresizingMaskIntoConstraints = NO; explain.textAlignment = NSTextAlignmentCenter; hugging(explain, 251); compression(explain, 999); explain.text = EXPLANATION; explain.font = [UIFont systemFontOfSize:14]; explain.minimumFontSize = 7; explain.numberOfLines = 0; [self.view addSubview:explain]; UIButton *returnButton = [UIButton buttonWithType:UIButtonTypeSystem]; returnButton.translatesAutoresizingMaskIntoConstraints = NO; returnButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; returnButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; returnButton.titleLabel.font = [UIFont systemFontOfSize:17]; [returnButton setTitle:@"Return to Normal" forState:UIControlStateNormal]; [self.view addSubview:returnButton]; UIButton *continueButton = [UIButton buttonWithType:UIButtonTypeSystem]; continueButton.translatesAutoresizingMaskIntoConstraints = NO; hugging(continueButton, 999); compression(continueButton, 300); continueButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; continueButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; continueButton.titleLabel.font = [UIFont systemFontOfSize:17]; [continueButton setTitle:@"Continue in Safe Mode" forState:UIControlStateNormal]; [self.view addSubview:continueButton]; autoGrid = [[AutoGrid alloc] init]; autoGrid.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:autoGrid]; NSDictionary *viewsDictionary = @{ @"top": top, @"big": big, @"explain": explain, @"returnButton": returnButton, @"continueButton": continueButton, @"grid": autoGrid, @"topGuide": self.topLayoutGuide, @"bottomGuide": self.bottomLayoutGuide, }; NSMutableArray *constraints = [[NSMutableArray alloc] init]; [constraints addObjectsFromArray: [NSLayoutConstraint constraintsWithVisualFormat: @"V:[topGuide]-10-[top]-0@100-[big]-0@100-[explain]-18@200-[grid]-18-[continueButton]-8-[returnButton]-20@100-[bottomGuide]" options:NSLayoutFormatAlignAllCenterX metrics:nil views:viewsDictionary]]; NSArray *additional = @[ @"[explain(<=650)]", @"|-10-[explain]-10-|", @"|-20-[grid]-20-|", ]; for (NSString *fmt in additional) { [constraints addObjectsFromArray: [NSLayoutConstraint constraintsWithVisualFormat:fmt options:0 metrics:nil views:viewsDictionary]]; } [self.view addConstraints:constraints]; } - (NSUInteger)supportedInterfaceOrientations { if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) return UIInterfaceOrientationMaskAll; else if ([UIScreen mainScreen].bounds.size.width >= 414) return UIInterfaceOrientationMaskAllButUpsideDown; else return UIInterfaceOrientationMaskPortrait; } @end @interface AppDelegate : UIResponder { } @property (strong, nonatomic) UIWindow *window; @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSLog(@"dflwo"); self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; ViewController *viewController = [[ViewController alloc] init]; self.window.rootViewController = viewController; [self.window makeKeyAndVisible]; return YES; } @end int main(int argc, char *argv[]) { NSLog(@"main"); @autoreleasepool { return UIApplicationMain(argc, argv, nil, @"AppDelegate"); } }