Home
Categories
EXPLORE
True Crime
Comedy
Society & Culture
Business
Sports
TV & Film
Technology
About Us
Contact Us
Copyright
© 2024 PodJoint
00:00 / 00:00
Sign in

or

Don't have an account?
Sign up
Forgot password
https://is1-ssl.mzstatic.com/image/thumb/Podcasts115/v4/81/1a/f8/811af848-e8a2-a16f-7140-1390ba4f999a/mza_4037948398361091679.png/600x600bb.jpg
The iOS Dev Diary
Jay Versluis
36 episodes
2 months ago
Join your friendly next-door hacker Jay Versluis for tips and tricks on iOS and macOS Development with Xcode and Objective-C.
Show more...
Technology
RSS
All content for The iOS Dev Diary is the property of Jay Versluis and is served directly from their servers with no modification, redirects, or rehosting. The podcast is not affiliated with or endorsed by Podjoint in any way.
Join your friendly next-door hacker Jay Versluis for tips and tricks on iOS and macOS Development with Xcode and Objective-C.
Show more...
Technology
http://pinkstone.co.uk/wp-content/uploads/powerpress/iOS-Podcast-Icon-2014.png
How to present a view controller on top of a UISplitView Controller – Part 1
The iOS Dev Diary
17 minutes 17 seconds
9 years ago
How to present a view controller on top of a UISplitView Controller – Part 1

Since its introduction in iOS 5, our good friend the UISplitView Controller has always had a really annoying habit: it has to be the root view controller in our apps. This means that it cannot be presented from any other view controller, nor can the split view controller present other view controllers.
This sucks because 99% of all apps probably need to present a user choice overlay at some point during the lifetime of an app. While some apps may get away with showing a Popover on iPad, many apps would be better off if we could present something like a proper form sheet as pictured in the image above. However, by Apple’s definition, that’s just not possible with the split view controller.
Or is it…?
In this screencast I’ll show you how to make it appear as if we could present another view controller over a UISplitView Controller. We’ll employ a bit of magic to create a great user experience, and it’s not really difficult either. The whole thing works on both iPhone and iPad with no extra work, and it works with apps in Slideover Mode too.
At the bottom of the article I’ll show you the code snippets to make this magic happen, together with a fully working demo project.
Enjoy!

 
Code Snippets
The app is based on the Xcode Master/Detail template. Aside from hooking up two buttons to present and dismiss the overlay, all methods are conveniently called in AppDelegate. We need three methods in total.
The first one will create a screenshot of whatever is currently on screen and return it as a UIImage:- (UIImage *)grabScreenshot {

// create graphics context with screen size
CGRect screenRect = [[UIScreen mainScreen] bounds];
UIGraphicsBeginImageContext(screenRect.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[[UIColor blackColor] set];
CGContextFillRect(ctx, screenRect);

// grab reference to our window
UIWindow *window = [UIApplication sharedApplication].keyWindow;

// transfer content into our context
[window.layer renderInContext:ctx];
UIImage *screengrab = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return screengrab;
}I’m explaining how this method works and what it does  in this article.
The next two methods need to be public, so let’s make sure their signature appears in our AppDelegate.h file, anywhere before the @end:- (void)showOverlay;
- (void)dismissOverlay;Back in our AppDelegate.m file, here’s the first method:- (void)showOverlay {

// grab a screenshot
UIImage *screenshot = [self grabScreenshot];

// create a new view controller with it
UIViewController *underlay = [[UIViewController alloc]init];
UIImageView *background = [[UIImageView alloc]initWithImage:screenshot];
underlay.view = background;

// grab the overlay controller
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *overlay = (UINavigationController *)[storyboard instantiateViewControllerWithIdentifier:@"Overlay"];
overlay.modalPresentationStyle = UIModalPresentationFormSheet;

// swap the split view
self.splitView = (UISplitViewController *)self.window.rootViewController;
self.window.rootViewController = underlay;

// present the overlay
[underlay presentViewController:overlay animated:YES completion:nil];
}Here we grab a screenshot using our previous method and create a brand new...
The iOS Dev Diary
Join your friendly next-door hacker Jay Versluis for tips and tricks on iOS and macOS Development with Xcode and Objective-C.