XCode 4.5 GMにアップグレードしたところ、ストーリーボードのビューコントローラに「4 "Retina"サイズを適用できるようになりました。
IPhone 4と5の両方で動作するアプリケーションを作成したい場合は、もちろんすべてのウィンドウを2回作成する必要がありますが、ユーザーが3.5インチまたは4インチの画面を持つiPhoneを使用しているかどうかを検出してから適用する必要があります。見ます。
どうすればいいの?
まず第一に、新しい画面に合わせてすべてのビューを再構築したり、異なる画面サイズに異なるビューを使用したりしないでください。
IOSの auto-resizing 機能を使用すると、ビューを調整したり、任意の画面サイズに合わせたりできます。
それほど難しいことではありません、 some documentation を読んでください。それはあなたに多くの時間を節約するでしょう。
iOS 6もこれに関する新機能を提供します。
Apple Developer Webサイトの iOS 6 API changelog を必ず読んでください。
そして、新しいiOS 6 AutoLayout capabilitiesを確認してください。
それでも、iPhone 5を本当に検出する必要がある場合は、 画面サイズ に頼ることができます。
[ [ UIScreen mainScreen ] bounds ].size.height
IPhone 5の画面の高さは568です。
これを簡単にするために、マクロを想像することができます。
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
H2CO3のコメントで指摘されているように、浮動小数点を比較するときにfabs
をイプシロンと一緒に使用すると、精度エラーを防ぐことができます。
したがって、これからは標準のif/else文で使用できます。
if( IS_IPHONE_5 )
{}
else
{}
編集 - より良い検出
一部の人々が述べているように、これは ワイドスクリーンを検出する のみを行い、実際のiPhone 5は検出しません。
IPod touchの次のバージョンでもそのようなスクリーンがあるかもしれないので、私たちは別のマクロのセットを使うかもしれません。
元のマクロの名前をIS_WIDESCREEN
に変更しましょう。
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
モデル検出マクロを追加しましょう。
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_iPod ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
こうすることで、iPhoneモデルの _と_ がワイドスクリーンになり、IS_IPHONE_5
マクロを再定義できるようになります。
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
@ LearnCocos2Dで述べられているように、アプリケーションがiPhone 5の画面用に最適化されていないと([email protected]画像がない)、このマクロは機能しません。ケース。
最適化されていないアプリでiPhone 5を検出する理由がわからないため、これが問題になるとは思わない。
重要 - iOS 8のサポート
IOS 8では、bounds
クラスのUIScreen
プロパティは、 デバイスの向き を反映するようになりました。
つまり、前のコードはそのままでは機能しません。
これを修正するには、nativeBounds
の代わりに新しいbounds
プロパティを使用することができます。これは向きによっては変化しないため、また縦長モードに基づいているためです。nativeBounds
の寸法はピクセル単位で計測されているため、iPhone 5の場合、高さは568ではなく 1136 になります。
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 */
}
次のようにして前のマクロを修正することができます。
#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 )
そしてもちろん、iPhone 6または6 Plusを検出する必要がある場合は、対応する画面サイズを使用してください。
SDKとOSの任意の組み合わせに対してテストおよび設計されています。
iPadタイプを追加しました。 iPad 2とiPad miniは網膜外のiPadです。 iPad Mini 2以上、iPad 3、4、iPad Air、Air 2、Air 3、およびiPad Pro 9.7の論理解像度は同じ1024です。iPadProのmaxLengthは1366です。参考文献
import UIKit
public enum DisplayType {
case unknown
case iphone4
case iphone5
case iphone6
case iphone6plus
case iPadNonRetina
case iPad
case iPadProBig
static let iphone7 = iphone6
static let iphone7plus = iphone6plus
}
public final class Display {
class var width:CGFloat { return UIScreen.main.bounds.size.width }
class var height:CGFloat { return UIScreen.main.bounds.size.height }
class var maxLength:CGFloat { return max(width, height) }
class var minLength:CGFloat { return min(width, height) }
class var zoomed:Bool { return UIScreen.main.nativeScale >= UIScreen.main.scale }
class var retina:Bool { return UIScreen.main.scale >= 2.0 }
class var phone:Bool { return UIDevice.current.userInterfaceIdiom == .phone }
class var pad:Bool { return UIDevice.current.userInterfaceIdiom == .pad }
class var carplay:Bool { return UIDevice.current.userInterfaceIdiom == .carPlay }
class var tv:Bool { return UIDevice.current.userInterfaceIdiom == .tv }
class var typeIsLike:DisplayType {
if phone && maxLength < 568 {
return .iphone4
}
else if phone && maxLength == 568 {
return .iphone5
}
else if phone && maxLength == 667 {
return .iphone6
}
else if phone && maxLength == 736 {
return .iphone6plus
}
else if pad && !retina {
return .iPadNonRetina
}
else if pad && retina && maxLength == 1024 {
return .iPad
}
else if pad && maxLength == 1366 {
return .iPadProBig
}
return .unknown
}
}
実際に見る https://Gist.github.com/hfossli/bc93d924649de881ee2882457f14e346
注: iPhone 6はズームモードです。UIはiPhone 5を拡大したものです。これらの機能はデバイスタイプを決定するものではありませんが、表示モード、つまりiPhone 5はこの例では望ましい結果です。
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_ZOOMED (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
注: iPhone 6はズームモードです。UIはiPhone 5を拡大したものです。これらの機能はデバイスタイプを決定するものではありませんが、表示モード、つまりiPhone 5はこの例では望ましい結果です。
本当に簡単な解決策
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
CGSize result = [[UIScreen mainScreen] bounds].size;
if(result.height == 480)
{
// iPhone Classic
}
if(result.height == 568)
{
// iPhone 5
}
}
IPhone 6と6Plusの画面サイズを考慮する必要があります。これが更新された答えです。
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
//its iPhone. Find out which one?
CGSize result = [[UIScreen mainScreen] bounds].size;
if(result.height == 480)
{
// iPhone Classic
}
else if(result.height == 568)
{
// iPhone 5
}
else if(result.height == 667)
{
// iPhone 6
}
else if(result.height == 736)
{
// iPhone 6 Plus
}
}
else
{
//its iPad
}
いくつかの役に立つ情報
iPhone 6 Plus 736x414 points 2208x1242 pixels 3x scale 1920x1080 physical pixels 401 physical ppi 5.5"
iPhone 6 667x375 points 1334x750 pixels 2x scale 1334x750 physical pixels 326 physical ppi 4.7"
iPhone 5 568x320 points 1136x640 pixels 2x scale 1136x640 physical pixels 326 physical ppi 4.0"
iPhone 4 480x320 points 960x640 pixels 2x scale 960x640 physical pixels 326 physical ppi 3.5"
iPhone 3GS 480x320 points 480x320 pixels 1x scale 480x320 physical pixels 163 physical ppi 3.5"
私は、MacmadeのマクロをCの関数に変換し、それがwidescreen availabilityとNOT _は必ずiPhone 5を検出するので、それを正しく命名しました。
プロジェクトに[email protected]が含まれていない場合、マクロはiPhone 5での実行も検出しません。新しいデフォルト画像がないと、iPhone 5は通常の480 x 320の画面サイズ(ポイント単位)を報告します。そのため、このチェックはワイドスクリーンの可用性だけではなく、ワイドスクリーンモードが有効になっているについても同様です。
BOOL isWidescreenEnabled()
{
return (BOOL)(fabs((double)[UIScreen mainScreen].bounds.size.height -
(double)568) < DBL_EPSILON);
}
これは私たちのコードです、テストは、デバイスやエミュレータに関係なく、iphone4、iphone5、ipad、iphone 6、iphone 6のios7/ios8に渡されます。
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) // iPhone and iPod touch style UI
#define IS_IPHONE_5_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
#define IS_IPHONE_6_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0f)
#define IS_IPHONE_6P_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0f)
#define IS_IPHONE_4_AND_OLDER_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height < 568.0f)
#define IS_IPHONE_5_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 568.0f)
#define IS_IPHONE_6_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 667.0f)
#define IS_IPHONE_6P_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 736.0f)
#define IS_IPHONE_4_AND_OLDER_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) < 568.0f)
#define IS_IPHONE_5 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_5_IOS8 : IS_IPHONE_5_IOS7 )
#define IS_IPHONE_6 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6_IOS8 : IS_IPHONE_6_IOS7 )
#define IS_IPHONE_6P ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6P_IOS8 : IS_IPHONE_6P_IOS7 )
#define IS_IPHONE_4_AND_OLDER ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_4_AND_OLDER_IOS8 : IS_IPHONE_4_AND_OLDER_IOS7 )
Hfossliの答えを使ってSwiftに翻訳した
let IS_IPAD = UIDevice.currentDevice().userInterfaceIdiom == .Pad
let IS_IPHONE = UIDevice.currentDevice().userInterfaceIdiom == .Phone
let IS_RETINA = UIScreen.mainScreen().scale >= 2.0
let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height
let SCREEN_MAX_LENGTH = max(SCREEN_WIDTH, SCREEN_HEIGHT)
let SCREEN_MIN_LENGTH = min(SCREEN_WIDTH, SCREEN_HEIGHT)
let IS_IPHONE_4_OR_LESS = (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
let IS_IPHONE_5 = (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
let IS_IPHONE_6 = (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
let IS_IPHONE_6P = (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
これは私のcocos2dプロジェクト用のマクロです。他のアプリでも同じでなければなりません。
#define WIDTH_IPAD 1024
#define WIDTH_IPHONE_5 568
#define WIDTH_IPHONE_4 480
#define HEIGHT_IPAD 768
#define HEIGHT_IPHONE 320
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
//width is height!
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_5 )
#define IS_IPHONE_4 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_4 )
#define cp_ph4(__X__, __Y__) ccp(cx_ph4(__X__), cy_ph4(__Y__))
#define cx_ph4(__X__) (IS_IPAD ? (__X__ * WIDTH_IPAD / WIDTH_IPHONE_4) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPHONE_4) : (__X__)))
#define cy_ph4(__Y__) (IS_IPAD ? (__Y__ * HEIGHT_IPAD / HEIGHT_IPHONE) : (__Y__))
#define cp_pad(__X__, __Y__) ccp(cx_pad(__X__), cy_pad(__Y__))
#define cx_pad(__X__) (IS_IPAD ? (__X__) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPAD) : (__X__ * WIDTH_IPHONE_4 / WIDTH_IPAD)))
#define cy_pad(__Y__) (IS_IPAD ? (__Y__) : (__Y__ * HEIGHT_IPHONE / HEIGHT_IPAD))
if ((int)[[UIScreen mainScreen] bounds].size.height == 568)
{
// This is iPhone 5 screen
} else {
// This is iPhone 4 screen
}
Swiftでは、iOS 8+プロジェクト私はUIScreen
の拡張をするのが好きです。
extension UIScreen {
var isPhone4: Bool {
return self.nativeBounds.size.height == 960;
}
var isPhone5: Bool {
return self.nativeBounds.size.height == 1136;
}
var isPhone6: Bool {
return self.nativeBounds.size.height == 1334;
}
var isPhone6Plus: Bool {
return self.nativeBounds.size.height == 2208;
}
}
(注:nativeBounds
はピクセル単位です)。
そしてコードは次のようになります。
if UIScreen.mainScreen().isPhone4 {
// do smth on the smallest screen
}
そのため、コードによって、これがメイン画面のチェックであり、デバイスモデルのチェックではないことが明らかになります。
Samrat Mazumdarの答えから借りて、ここでデバイスの画面サイズを推定する簡単な方法です。これは最新のデバイスでは動作しますが、将来のデバイスでは失敗する可能性があります(すべての推測方法で可能性があるため)。デバイスがミラーリングされている場合も混乱します(ミラーリングされたスクリーンサイズではなく、デバイスのスクリーンサイズを返します)。
#define SCREEN_SIZE_IPHONE_CLASSIC 3.5
#define SCREEN_SIZE_IPHONE_TALL 4.0
#define SCREEN_SIZE_IPAD_CLASSIC 9.7
+ (CGFloat)screenPhysicalSize
{
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
CGSize result = [[UIScreen mainScreen] bounds].size;
if (result.height < 500)
return SCREEN_SIZE_IPHONE_CLASSIC; // iPhone 4S / 4th Gen iPod Touch or earlier
else
return SCREEN_SIZE_IPHONE_TALL; // iPhone 5
}
else
{
return SCREEN_SIZE_IPAD_CLASSIC; // iPad
}
}
私は答えがシミュレータのための特別なケースを含まないことがわかりました。
#define IS_WIDESCREEN ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
#define IS_IPHONE ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPhone"].location != NSNotFound)
#define IS_IPAD ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPad"].location != NSNotFound)
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
+(BOOL)isDeviceiPhone5
{
BOOL iPhone5 = FALSE;
CGRect screenBounds = [[UIScreen mainScreen] bounds];
if (screenBounds.size.height == 568)
{
// code for 4-inch screen
iPhone5 = TRUE;
}
else
{
iPhone5 = FALSE;
// code for 3.5-inch screen
}
return iPhone5;
}
私はこのマクロがデバイスとシミュレータでうまくいくならば、それは良いはずだと思います、以下は解決策です。
#define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)
#define IS_IPHONE (([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"]) || ([[[UIDevice currentDevice] model] isEqualToString: @"iPhone Simulator"]))
#define IS_iPod ([[[UIDevice currentDevice]model] isEqualToString:@"iPod touch"])
#define IS_IPHONE_5 ((IS_IPHONE || IS_iPod) && IS_WIDESCREEN)
CGFloat height = [UIScreen mainScreen].bounds.size.height;
NSLog(@"screen soze is %f",height);
if (height>550) {
// 4" screen-do some thing
}
else if (height<500) {
// 3.5 " screen- do some thing
}
'New Swift File'を追加 - > AppDelegateEx.Swift
AppDelegate
に拡張子を追加する
import UIKit
extension AppDelegate {
class func isIPhone5 () -> Bool{
return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 568.0
}
class func isIPhone6 () -> Bool {
return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 667.0
}
class func isIPhone6Plus () -> Bool {
return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 736.0
}
}
使用法:
if AppDelegate.isIPhone5() {
collectionViewTopConstraint.constant = 2
}else if AppDelegate.isIPhone6() {
collectionViewTopConstraint.constant = 20
}
これにより、デバイスファミリを検出できます。
#import <sys/utsname.h>
NSString* deviceName()
{
struct utsname systemInformation;
uname(&systemInformation);
NSString *result = [NSString stringWithCString:systemInformation.machine
encoding:NSUTF8StringEncoding];
return result;
}
#define isIPhone5 [deviceName() rangeOfString:@"iPhone5,"].location != NSNotFound
#define isIPhone5S [deviceName() rangeOfString:@"iPhone6,"].location != NSNotFound
Swift 3では、私の単純なクラスKRDeviceTypeを使うことができます。
https://github.com/ulian-onua/KRDeviceType
よく文書化されていて、演算子==、> =、<=をサポートしています。
たとえば、デバイスにiPhone 6/6s/7の境界があるかどうかを検出するには、次の比較を使用します。
if KRDeviceType() == .iPhone6 {
// Perform appropiate operations
}
デバイスにiPhone 5/5S/SE以前(iPhone 4s)の境界があるかどうかを検出するには、次の比較を使用できます。
if KRDeviceType() <= .iPhone5 { //iPhone 5/5s/SE of iPhone 4s
// Perform appropiate operations (for example, set up constraints for those old devices)
}
サイズを頼りにすることは非常に多くのレベルで間違っています。システムに問い合わせてはどうですか。
- (NSString *) getDeviceModel
{
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}
から抜粋 ハードウェアの種類、iPhone4またはiPhone5を検出する最良の方法? 、edzio27回答。
プロジェクトがXcode 6を使用して作成されている場合は、下記のコードを使用してデバイスを検出します。
printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height);
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){
printf("Device Type : iPhone 4,4s ");
}else if([[UIScreen mainScreen] nativeBounds].size.height == 1136){
printf("Device Type : iPhone 5,5S/iPod 5 ");
}else if([[UIScreen mainScreen] nativeBounds].size.height == 1334){
printf("Device Type : iPhone 6 ");
}else if([[UIScreen mainScreen] nativeBounds].size.height == 2208){
printf("Device Type : iPhone 6+ ");
}
}
}else{
printf("Device Type : iPad");
}
プロジェクトがXcode 5で作成され、Xcode 6で開かれた場合は、下記のコードを使用してデバイスを検出します(このコードは、iPhone 6,6+用の起動画像が割り当てられていない場合は機能します)。 )
printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height);
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){
printf("Device Type : iPhone 4,4s");
appType=1;
}else if([[UIScreen mainScreen] nativeBounds].size.height == 1136 || [[UIScreen mainScreen] nativeBounds].size.height == 1704){
printf("Device Type : iPhone 5,5S,6,6S/iPod 5 ");
appType=3;
}
}
}else{
printf("Device Type : iPad");
appType=2;
}
それでもXcode 5をすべて一緒に使用している場合は、次のコードを使用してデバイスを検出します(iPhone 6および6+は検出されません)
printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] bounds].size.width,(int)[[UIScreen mainScreen] bounds].size.height);
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);
if(result.height == 960 || result.height == 480){
printf("Device Type : iPhone 4,4S ");
}else if(result.height == 1136){
printf("Device Type : iPhone 5s/iPod 5");
}
}
}else{
printf("Device Type : iPad");
}
これは100回答えられました、しかし、この解決策は私のために最もよく働きました。これは単純なヘルパー関数であり、システムクラスを拡張する必要はありません。
Swift 3 Helper:
func phoneSizeInInches(defaultValue: Float = 4.7) -> Float {
switch (UIScreen.main.nativeBounds.size.height) {
case 960, 480:
return 3.5
case 1136:
return 4
case 1334:
return 4.7
case 2208:
return 5.5
default:
return defaultValue
}
}
これは、 "5.5インチ"や "4.7インチ"などの携帯電話のインチサイズを記憶するのは簡単ですが、正確なピクセルサイズを覚えるのは難しいためです。
if phoneSizeInInches() == 4 {
//do something with only 4 inch iPhones
}
これはまたあなたにこのようなことをする機会を与えます:
if phoneSizeInInches() < 5.5 {
//do something all iPhones smaller than the plus
}
"defaultValue"を指定すると、Appleが新しいデバイスサイズをリリースしてもまだアプリを更新していない場合、コードは常に安全なサイズにフォールバックします。
if phoneSizeInInches(defaultValue: 4.7) == 4 {
//if a new iPhone size is introduced, your code will default to behaving like a 4.7 inch iPhone
}
これは電話のアプリに特有のもので、普遍的なアプリのためにいくつかの変更が必要になるでしょう。
これは、向きに依存しない、デバイスの正しいテストです。
- (BOOL)isIPhone5
{
CGSize size = [[UIScreen mainScreen] bounds].size;
if (MIN(size.width,size.height) == 320 && MAX(size.width,size.height == 568)) {
return YES;
}
return NO;
}
次のコードを使用してください。
CGFloat screenScale = [[UIScreen mainScreen] scale];
CGRect screenBounds = [[UIScreen mainScreen] bounds];
CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale);
if (screenSize.height==1136.000000)
{
// Here iPhone 5 View
// Eg: Nextview~iPhone5.Xib
} else {
// Previous Phones
// Eg : Nextview.xib
}