简体   繁体   中英

How to detect IOS 7 and IOS 8 and widescreen iPhone sizes to make my app universal?

I am developing universal IOS app for all devices and IOS 7 and IOS 8. and I have this macros:

This macros is for detecting widescreen iPhone 5, this works for IOS 7:

#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

This macros is also for for widescreen iPone 5, but works only for IOS 8:

#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )

I need to combine this code to make it work on both IOS 7 and IOS 8and for that I need selector that detects IOS version., here is the code:

#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
#define IS_WIDESCREEN      ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )

then the author of the post suggests to quote -"If you're also targeting iOS 7 or lower, be sure to use feature detection, as calling nativeBounds prior to iOS 8 will crash your app:" and gives following code:

if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
    /* Detect using nativeBounds - iOS 8 and greater */
}
else
{
    /* Detect using bounds - iOS 7 and lower */
}

Please help me here I am a beginner developer and want to understand to to make it work. Where should I put SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"Background"];?

All this code is from different post in Stackoverflow post here is it: How to detect iPhone 5 (widescreen devices)?

I uploaded images to drop box here is the link https://www.dropbox.com/sh/pnll2e2jvo0uigs/AACOLbzzQqZlJEZZcBx7TMR1a?dl=0 the folder is called measuredImages. here is the code I use for adding background: #import "GameScene.h"

@implementation GameScene
-(id)initWithSize:(CGSize)size {
    if (self = [super initWithSize:size]) {
SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"Background-568"]; background.anchorPoint = CGPointMake(0.5, 1);
        background.position = CGPointMake(self.size.width/2, self.size.height);
        [self addChild:background];}
    return self;
}

If someone could put full code with macros and usage in answer I would greatly appreciate it.

Important UPDATE:12.17.2014

This problem was solved by including the right launch images and my app run in the right resolution and I used screen bounds [same as in ios7], as Daij-Djan suggested. Thanks to everybody who tried or helped me to solve this problem,I personally want to thank Daij-Djan and sha for help and support. If you need the code for widescreen iphones I will leave it in my own answer below, it runs on all iPhones above iPhone 4 and all iPads.

When I need a quick and dirty way detecting iOS7/8 and iPhone/iPad device I will use the following macros:

#define IS_IOS8     ([[UIDevice currentDevice].systemVersion compare:@"8.0" options:NSNumericSearch] != NSOrderedAscending)
#define IS_IPHONE   ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)

And you can use these macros:

if (IS_IPHONE) {
   // iPhone specific code
   ...
}
else {
   // iPad specific code 
   ...
}

if (IS_IOS8) {
   // Code specific to iOS8+
   ...
}
else {
   // Code specific to earlier versions of iOS
   ...
}

UPDATE: To detect wide screen devices you can use the following macro (since iOS8 UIScreen will be orientation aware and height will be different in portrait/landscape, so you can check for both:

#define IS_WIDESCREEN (( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON ) || ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.width - ( double )568 ) < DBL_EPSILON ))

Use This is Very useful

#define IS_IPHONE       ((int)(MAX([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)) == 480)
#define IS_IPHONE5      ((int)(MAX([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)) == 568)
#define IS_IPHONE6      ((int)(MAX([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)) == 667)
#define IS_IPHONE6PLUS  ((int)(MAX([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)) == 736)

To detect iOS versions you can use one of the following macros :

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

Example:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
    // code here
}

And to detect iPhone types, you can use,

CGSize applicationFrameSize = [UIScreen mainScreen].bounds.size;
CGFloat maxHeight = (MAX(applicationFrameSize.width, applicationFrameSize.height));
_is4GDevice = (maxHeight == 480.0 || maxHeight == 480.0);
_is5GDevice = (maxHeight == 568.0 || maxHeight == 568.0);
_is6GDevice = (maxHeight == 667.0 || maxHeight == 667.0);
_is6PlusDevice = (maxHeight == 736.0 || maxHeight == 736.0);

you don't need to go os specific for detecting the screen width.

just include the right launch images and your app will run in the right resolution and you can just use the screen bounds [same as in ios7]

I stress again: include right launch images! THEN use the UIScreen bounds

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/LaunchImages.html

Ok so the salvation to this problem is to include right launch images to image.xcassets or LaunchImage.xib and compiler will pick right size screen for your images as Daij-Djan mentioned in above answer. To make it work for widescreen iPhones and all iPhones (4,4s and above) and iPads and IOS 7 and IOS 8. add this macros your MyScene.m file or just any .m file where you use it.

 #define IS_WIDESCREEN_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_WIDESCREEN_6 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )667 ) < DBL_EPSILON )

and use this code for detecting widescreen iPhones, this works for all IOS devices and IOS 7 and IOS 8:

   -(id)initWithSize:(CGSize)size {

    if (self = [super initWithSize:size]) {
        SKSpriteNode *background;
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
            if (IS_WIDESCREEN_5) {
                //detects WIDESCREEN iPhone 5,5c,5s for both IOS 7,8
            background= [SKSpriteNode spriteNodeWithImageNamed:@"Background-568"];
            }else if (IS_WIDESCREEN_6){
                //detects WIDESCREEN iPhone 6 for both IOS 7,8
            background= [SKSpriteNode spriteNodeWithImageNamed:@"Background-667"];

            }else{
                //detects iPhone 4,4s,iPhone 6 Plus, for both IOS 7,8
            background= [SKSpriteNode spriteNodeWithImageNamed:@"Background"];
            }
        }else{
            //detects iPads all sizes and resolutions (Ipad regular display and iPad retina display)
             background= [SKSpriteNode spriteNodeWithImageNamed:@"Background~iPad"];
        }

    background.anchorPoint = CGPointMake(0.5, 1);
    background.position = CGPointMake(self.size.width/2, self.size.height);
    [self addChild:background];

    }
    return self;
}

And last step is name you images this way: Background@2x.png for iPhone 4,4s, Background-568@2x for widescreen iPhone 5,5c,5s, Background-667@2x.png for widescreen iPhone 6, background@3x.png for iPhone 6 Plus, Background~iPad.png for iPad regular display and lastly Background~iPad@2x.png for iPad Retina Display. You can download this images optimized for specific screen sizes from dropbox. Here is the link https://www.dropbox.com/sh/pnll2e2jvo0uigs/AACOLbzzQqZlJEZZcBx7TMR1a?dl=0 and try it. Last and most important thing is to add launch Images for each screen size otherwise the code will not work. I hope this helps and thanks for you guys who teach me all this I lost 2 months to get it work because I had wrong info.

It works on 5c & 6 & 6plus. It will check whether the screen is 16 : 9. I am a new iOS programmer, please advise

bool IsTargetDeviceWideScreen()
{
    double screenWidth  = 0;
    double screenHeight = 0;
    if ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) {
        CGSize screenSize = [ [ UIScreen mainScreen ] nativeBounds ].size;
        screenWidth       = screenSize.width;
        screenHeight      = screenSize.height;
    }
    else
    {
        CGSize screenSize = [ [ UIScreen mainScreen ] bounds ].size;
        screenWidth       = screenSize.width;
        screenHeight      = screenSize.height;
    }
    NSLog(@"screen size");
    NSLog(@"%f", screenWidth);
    NSLog(@"%f", screenHeight);
    double rateWidthHeight = 0;
    if (screenWidth < screenHeight) {
        rateWidthHeight = (screenWidth * 16) / (screenHeight * 9);
    }
    else
    {
        rateWidthHeight = (screenWidth * 9) / (screenHeight * 16);
    }
    NSLog(@"%f", rateWidthHeight);
    if ( 0.99 < rateWidthHeight & rateWidthHeight < 1.01) {
        return true;
    }
    return false;

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM