[英]How to detect IOS 7 and IOS 8 and widescreen iPhone sizes to make my app universal?
我正在为所有设备以及IOS 7和IOS 8开发通用的IOS应用程序。我有以下宏:
此宏用于检测宽屏iPhone 5,适用于IOS 7:
#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
此宏也适用于宽屏iPone 5,但仅适用于IOS 8:
#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
我需要组合此代码以使其在IOS 7和IOS 8上都能工作,为此,我需要选择器来检测IOS版本。这是代码:
#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 )
然后该帖子的作者建议引用-“如果您还针对iOS 7或更低版本,请确保使用功能检测,因为在iOS 8之前调用nativeBounds会使您的应用程序崩溃:”并给出以下代码:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
请在这里为我提供帮助,我是一名初学者,并且希望了解使其正常工作。 我应该在哪里放置SKSpriteNode * background = [SKSpriteNode spriteNodeWithImageNamed:@“ Background”] ;?
所有这些代码都来自Stackoverflow的其他文章,它是: 如何检测iPhone 5(宽屏设备)?
我将图像上传到投递箱,这里是链接https://www.dropbox.com/sh/pnll2e2jvo0uigs/AACOLbzzQqZlJEZZcBx7TMR1a?dl=0,该文件夹称为measuredImages。 这是我用来添加背景的代码:#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;
}
如果有人可以在宏中添加完整的代码和用法,我将不胜感激。
重要更新:12.17.2014
如Daij-Djan所建议的,此问题通过包括正确的启动图像并以正确的分辨率运行我的应用程序来解决,并且我使用了屏幕边界(与ios7中相同)。 感谢所有尝试或帮助我解决此问题的人,我个人想感谢Daij-Djan和sha的帮助和支持。 如果您需要宽屏iphone的代码,我将在下面的答案中保留该代码,该代码可在高于iPhone 4的所有iPhone和所有iPad上运行。
当我需要快速而又肮脏的方式来检测iOS7 / 8和iPhone / iPad设备时,我将使用以下宏:
#define IS_IOS8 ([[UIDevice currentDevice].systemVersion compare:@"8.0" options:NSNumericSearch] != NSOrderedAscending)
#define IS_IPHONE ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
您可以使用以下宏:
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
...
}
更新:要检测宽屏设备,您可以使用以下宏(因为iOS8 UIScreen可以识别方向,并且纵向/横向的高度不同,因此可以同时检查两者:
#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 ))
使用这非常有用
#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)
要检测iOS版本,可以使用以下宏之一:
#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)
例:
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
// code here
}
要检测iPhone类型,您可以使用
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);
只需包含正确的启动图像,您的应用将以正确的分辨率运行,并且您可以使用屏幕边界[与ios7中相同]
我再次强调:包括正确的启动图像! 然后使用UIScreen bounds
好的,对这个问题的补救是将正确的启动图像包括到image.xcassets或LaunchImage.xib中,编译器将为您的图像选择正确的大小屏幕,如上面答案中的Daij-Djan所述。 为了使其适用于宽屏iPhone和所有iPhone(4,4s及更高版本)以及iPad和IOS 7和IOS8。将此宏添加到MyScene.m文件或使用它的任何.m文件中。
#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 )
并将此代码用于检测宽屏iPhone,该代码适用于所有IOS设备以及IOS 7和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;
}
最后一步就是用这种方式命名您的图像:iPhone 4,4s的Background@2x.png,宽屏iPhone 5,5c,5s的Background-568 @ 2x,宽屏iPhone 6的Background-667 @ 2x.png,background @ 3x iPhone 6 Plus为.png,iPad常规显示为Background〜iPad.png,iPad Retina Display为Background~iPad@2x.png。 您可以从Dropbox下载针对特定屏幕尺寸优化的图像。 这是链接https://www.dropbox.com/sh/pnll2e2jvo0uigs/AACOLbzzQqZlJEZZcBx7TMR1a?dl=0并尝试一下。 最后也是最重要的事情是为每个屏幕尺寸添加启动图像,否则代码将无法正常工作。 我希望这对您有所帮助,并感谢你们教给我的所有信息,我因为信息错误而失去了2个月才能正常工作。
它适用于5c&6&6plus。 它将检查屏幕是否为16:9。我是新的iOS程序员,请告知
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.