Today I updated from Xcode 7.0.1 to 7.1.1 just for iPad Pro simulator. The iPad Pro resolution is different from all other iPads so is the iPad Pro simulator just stretching my game to fit into iPad Pro? The iPad Pro simulator, my app doesn't have a stretched look though it looks great. I'm confused, is the simulator just playing a stretched version of iPad Air 2 or if I were to use iPad Pro device and run the app, i'd see also a perfectly fitted iPad Pro app running?
The iPad PRO is loading the code from iPad AIR, iPad AIR 2 and iPad RETINA simulators
For anyone still having above issues here's the solution I found:
In AppDelegate.m, in the application didFinishLaunchingWithOptions code, use the following code:
if (([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && [UIScreen mainScreen].bounds.size.height == 1366))
{
UIStoryboard *iPadPRO = [UIStoryboard storyboardWithName:#"iPadPRO" bundle:nil];
UIViewController *initialViewController =[iPadPRO instantiateInitialViewController];
self.window.rootViewController = initialViewController;
[self.window makeKeyAndVisible];
}
else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
if ([[UIScreen mainScreen] respondsToSelector:#selector(scale)] && [[UIScreen mainScreen] scale] == 2){
UIStoryboard *iPadRetina = [UIStoryboard storyboardWithName:#"iPadRetina" bundle:nil];
UIViewController *initialViewController =[iPadRetina instantiateInitialViewController];
self.window.rootViewController = initialViewController;
[self.window makeKeyAndVisible];
}
Related
I created an iPhone 6 class and iPhone 5 class. In app delegate I used the following code for each size to be recognized...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CGSize iosScreenSize = [[UIScreen mainScreen] bounds].size;
if (iosScreenSize.height ==568) {
UIStoryboard *iPhone5 =[UIStoryboard storyboardWithName:#"iPhone5" bundle:nil];
UIViewController *initialViewController =[iPhone5 instantiateInitialViewController];
self.window.rootViewController = initialViewController;
[self.window makeKeyAndVisible];
}
if (iosScreenSize.height == 667) {
UIStoryboard *iPhone6 = [UIStoryboard storyboardWithName:#"iPhone6" bundle:nil];
UIViewController *initialViewController =[iPhone6 instantiateInitialViewController];
self.window.rootViewController = initialViewController;
[self.window makeKeyAndVisible];
}
return YES;
}
The simulator picks up iPhone 5 storyboard when needed and iPhone 6 storyboard when needed however, the device picks the wrong storyboard. When I use the iPhone 6 device, Xcode plays my iPhone 5 storyboard on iPhone 6 device. How do I get Xcode to play my iPhone 6 storyboard on iPhone 6 device?
In the app delegate I have this written to determine which storyboard will be opened depending on the screen size,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIStoryboard *storyboard = [self grabStoryboard];
// show the storyboard
self.window.rootViewController = [storyboard instantiateInitialViewController];
[self.window makeKeyAndVisible];
return YES;
}
- (UIStoryboard *)grabStoryboard {
UIStoryboard *storyboard;
// detect the height of our screen
int width = [UIScreen mainScreen].bounds.size.width;
if (width == 480) {
storyboard = [UIStoryboard storyboardWithName:#"iphone4" bundle:nil];
// NSLog(#"Device has a 3.5inch Display.");
} else {
storyboard = [UIStoryboard storyboardWithName:#"Main" bundle:nil];
// NSLog(#"Device has a 4inch Display.");
}
return storyboard;
}
The app opens landscape on the device.
This will properly choose between a 3.5 inch device and a 4 inch device in the simulators, but won't properly display in an actual 3.5 inch device. In Xcode 6 it opens the correct storyboard for the 4s or the 5, 6 ,6+ depending on the width of the screen but when tested on an actual Iphone 4s (with ios 7.1.1) the storyboard configured for 4 inch devices is displayed.
This question already has answers here:
IOS 8 image scaling and auto layout
(3 answers)
Closed 7 years ago.
I'm current running the iPhone 6 simulator in my project.
I know with different iPhones you need different resolution settings.
If I want to develop for the iPhone 4, 5, 6 and 6+. In my situation, what should be the sizes for 4, 5 and 6+. I think I don't need to change 6 because I'm using it as my base.
(If you could, please add iPad to list)
If someone could in direct me to how iOS automatically selects the right image resolution according to what device they have.
Any questions just comment!
I did this in Objective-C a while ago, so forgive me if it's different for Swift.
You have to make a different .storyboard file for each image resolution, and then in your AppDelegate.m you add a some code like:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIStoryboard *iPhone4storyBoard = [UIStoryboard storyboardWithName:#"storyboard4" bundle:[NSBundle mainBundle]];
// Device is an iPhone 5 or 5S
UIStoryboard *iPhone5storyBoard = [UIStoryboard storyboardWithName:#"storyboard5" bundle:[NSBundle mainBundle]];
// And so on...
if ([UIScreen mainScreen].bounds.size.height == 568.0) {
self.window.rootViewController = [iPhone5storyBoard instantiateInitialViewController];
} else if (/* test for other devices here */){
self.window.rootViewController = [iPhone6storyBoard instantiateInitialViewController];
}
[self.window makeKeyAndVisible];
[[UIApplication sharedApplication] setStatusBarHidden:YES];
return YES:
}
Which checks for device resolution, and applies the relevant storyboard.
Also, a suggestion for resizing images: Use Prepo.
Prepo automatically resizes app icons and splash screens to the desired values.
I want to optimize my app for iPhone 6 and iPhone 6+
But I have a launch screen size problem.
I created a simple project, and AppDelegate's code is:
#import "AppDelegate.h"
#import "ViewControllerOne.h" //xib screen size is 4 inch.
#import "ViewControllerTwo.h" // xib screen size is 4.7 inch.
#import "ViewControllerThree.h" // xib screen size is 5.5 inch.
#implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
if ([UIScreen mainScreen].bounds.size.height == 568.0) {//4 inch
ViewControllerOne *first = [[ViewControllerOne alloc]init];
UINavigationController *navigation = [[UINavigationController alloc]initWithRootViewController:first];
self.window.rootViewController = navigation;
}
else if ([UIScreen mainScreen].bounds.size.height == 667.0){//4.7inch
ViewControllerTwo * second = [[ViewControllerTwo alloc]init];
UINavigationController *navigation = [[UINavigationController alloc]initWithRootViewController:second];
self.window.rootViewController = navigation;
}
else if ([UIScreen mainScreen].bounds.size.height == 736.0){//5.5inch
ViewControllerThree *third = [[ViewControllerThree alloc]init];
UINavigationController *navigation = [[UINavigationController alloc]initWithRootViewController:third];
self.window.rootViewController = navigation;
}
}
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
#end
When I run iPhone 6 or iPhone 6+ simulator, it always appears 4inch screen when I run this project.(I included three launch image(Default-667h#2x.png, Default-736#3x.png, Default-568#2x.png) also.
What I have to do to resolve this problem.
I checked others question that similar to mine, and used their code, but all of those not works. That is maybe my technical skills relatively row.
Once you specify the images in Assets Catalog you will see the right images
Go to YourAppTarget> General> App Icons and Launch Images> Launch Image Source > Use asset Catalog
and then drag the appropriate size for each device.
In addition to adding images you can also add a Launch Screen File. This is a .XIB file that allows you to specify constraints in addition of launch images. It only works on iOS8. To support iPhone 6 and 6+, we only add this file and specify constraints:
To set the Launch Screen File add it to your project:
File > New > User Interface > Launch Screen
Then go to: YourAppTarget > General > App Icons and Launch Image s> Launch Screen File > Set your newly created image
You will still need launch images for Retina 4" and 3.5", if you are supporting iOS 7.
I have created 5 extra Storyboards and I have deleted the main storyboard. This is because I would like to have 5 separate storyboards for the iPhone and iPad to match 5 different screen sizes. So far I have one for the iPhone 3.5 inch, one for the iPhone 4 inch, one for the iPhone 4.7 inch, one for the iPhone 5.5 inch and one for the iPad. I have put the code bellow in to link it all up and make it work. However, it doesn't work when you try and build the project. There is no errors but lets say I go into the iPhone 3.5 inch storyboard and I add a UIViewController and a Button or label, then when you build the project it goes to your launch screen and then it doesn't do anything from there. I have put the starting arrow in at the UIViewController but I cannot get anything to come up apart from the launch screen. I have tried this on all the storyboards and their simulators. I am wondering if I have missed something out in the code but I am not sure.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIStoryboard *storyboard = nil;
if ([[UIDevice currentDevice] userInterfaceIdiom] ==UIUserInterfaceIdiomPad) {
storyboard = [UIStoryboard storyboardWithName:#"Storyboard_iPad" bundle:nil];//iPad
} else {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 480){
storyboard = [UIStoryboard storyboardWithName:#"Storyboard_iPhone4S" bundle:nil];//iPhone 3.5inch
} else
if (screenSize.height == 568){
storyboard = [UIStoryboard storyboardWithName:#"Storyboard_iPhone5/5C/5S" bundle:nil];//iPhone 4inch
}
else
{ if (screenSize.height == 667){
storyboard = [UIStoryboard storyboardWithName:#"Storyboard_iPhone6" bundle:nil];//iPhone 4.7inch
} else
if (screenSize.height == 736){
storyboard = [UIStoryboard storyboardWithName:#"Storyboard_iPhone6Plus" bundle:nil];//iPhone 5.5inch
} else
//default storyboard
storyboard = [UIStoryboard storyboardWithName:#"Main.Storyboard" bundle:nil];
}
}
self.window.rootViewController = [storyboard instantiateInitialViewController];
[self.window makeKeyAndVisible];
return YES;
}
Find your info.plist file in your project and remove the line called "Main storyboard file base name".
Also, you forgot to create the window (credits to rdelmar).
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
I strongly advise you to look into Auto Layout and Size Classes. Using these two, you can support all screen sizes within one single Storyboard. It's a bit hard to get in the beginning, but it'll definitely be worth it in the long run.
There's a video about this from the most recent WWDC called Building Adaptive Apps with UIKit.