XCode 4.5 GMにアップグレードしたところ、ストーリーボードのビューコントローラに「4」のRetinaサイズを適用できることがわかりました。
ここで、iPhone 4と5の両方で実行するアプリケーションを作成する場合は、もちろんすべてのウィンドウを2回ビルドする必要がありますが、ユーザーが3.5 "または4"画面のiPhoneを使用しているかどうかを検出してから、見る。
どうすればいいですか?
XCode 4.5 GMにアップグレードしたところ、ストーリーボードのビューコントローラに「4」のRetinaサイズを適用できることがわかりました。
ここで、iPhone 4と5の両方で実行するアプリケーションを作成する場合は、もちろんすべてのウィンドウを2回ビルドする必要がありますが、ユーザーが3.5 "または4"画面のiPhoneを使用しているかどうかを検出してから、見る。
どうすればいいですか?
回答:
まず、すべてのビューを新しい画面に合わせて再構築したり、画面サイズごとに異なるビューを使用したりしないでください。
自動サイズ変更を使用するiOS機能を、ビューを調整し、任意の画面サイズに適応させることができます。
それはそれほど難しくありません、いくつかのドキュメントを読んでください。それ。それはあなたに多くの時間を節約します。
iOS 6には、これに関する新機能も用意されています。Apple Developer WebサイトのiOS 6 API変更ログを
必ずお読みください。
そして、新しいiOS 6 AutoLayout機能を確認してください。
そうは言っても、本当に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 )
の用法 fabs
H2CO3のコメントで指摘されているように、浮動小数点を比較するときに、イプシロンをと、精度エラーを防止できます。
したがって、今後は標準の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画面用に最適化されていない場合(Default-568h@2x.png画像がない場合)、このマクロは機能しないことに注意してください。ケース。
最適化されていないアプリでiPhone 5を検出する理由がわからないので、これが問題になることはないと思います。
重要-iOS 8のサポート
iOS 8では、クラスのbounds
プロパティにデバイスの向きがUIScreen
反映されるようになりました。
したがって、前のコードはそのままでは機能しません。
これを修正するnativeBounds
にはbounds
、方向では変化せず、縦向きモードに基づいているため、の代わりに新しいプロパティを使用できます。
の寸法はnativeBounds
ピクセル単位で測定されるため、iPhone 5の高さは568ではなく1136になります。
iOS 7 nativeBounds
以前もターゲットにしている場合は、必ず機能検出を使用してください。iOS8より前に呼び出すと、アプリがクラッシュします。
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を検出する必要がある場合は、対応する画面サイズを使用してください。
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
DBL_EPSILON
はここでは不要であり、==
比較は失敗しないことに注意してください。浮動小数点値を正確な数値として表現できない場合(1.0/3.0*3.0
たとえば)、この方法で差分を使用して比較する必要があるだけです。詳細はこの記事を読んでください;)
SDKとOSの任意の組み合わせに対してテストおよび設計されています。
iPadタイプを追加しました。iPad 2とiPad miniはRetina以外のiPadです。上記のiPadミニ2&ながら、アプリ3、4、iPadの空気、エア2、エアー3、およびiPadは9.7が1024のiPad Proは1366のmaxLengthの有する同一の論理解像度有するプロ リファレンス
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)
使用法:http : //pastie.org/9687735
注:たとえばiPhone 6がズームモードの場合、UIはiPhone 5のズームアップバージョンです。これらの機能はデバイスタイプを決定するものではなく、表示モードなので、この例ではiPhone 5が望ましい結果です。
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
、iPhone4とiPhone5の両方とiPad Retinaと非Retinaの違いを判別するのに役立ちます
SCREEN_MAX_LENGTH
iPhone 5ですべての回転で568を取得するために使用します
本当にシンプルなソリューション
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"
私はCの関数にMacmadeでマクロを入れて、それが検出されるため、正しくそれに名前を付けるために自由を撮影したワイドスクリーンの可用性をしてないで、必ずしもiPhone 5。
プロジェクトにDefault-568h@2x.pngが含まれていない場合、マクロはiPhone 5での実行も検出しません。新しいデフォルト画像がない場合、iPhone 5は通常の480x320画面サイズ(ポイント単位)を報告します。したがって、このチェックはワイドスクリーンの可用性だけでなく、ワイドスクリーンモードが有効になっていることも確認します。
BOOL isWidescreenEnabled()
{
return (BOOL)(fabs((double)[UIScreen mainScreen].bounds.size.height -
(double)568) < DBL_EPSILON);
}
inline
d にすることができます。また、コンパイラーのオプティマイザーがそれが良いアイデアであると判断した場合、およびそれが許容できることを確認できる場合(関数が同じモジュール内にある場合など)もインライン化されます。このようなものを関数で実装すると、追加の型チェックが行われる場合があります。
以下は、デバイスやシミュレーターに関係なく、iphone4、iphone5、ipad、iphone6、iphone6pの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 (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)
回答にはシミュレータの特別なケースが含まれていないことがわかりました。
#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;
}
iPhone5 = FALSE;
変更されていない場合、変数はすでにその値を持っているので不要です
サイズに依存することは非常に多くのレベルで間違っています。システムに聞いてみませんか?
- (NSString *) getDeviceModel
{
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}
撮影ハードウェアタイプ、iPhone4のかのiPhone5を検出するための最良の方法?、edzio27回答。
このようにして、デバイスファミリを検出できます。
#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
プロジェクトが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");
}
「新しいSwiftファイル」を追加します-> 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
}
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)
}
これは100回回答されていますが、このソリューションは私にとって最も効果的で、新しいデバイスが導入され、サイズが定義されていない場合の問題の解決に役立ちました。
Swift 5ヘルパー:
extension UIScreen {
func phoneSizeInInches() -> CGFloat {
switch (self.nativeBounds.size.height) {
case 960, 480:
return 3.5 //iPhone 4
case 1136:
return 4 //iPhone 5
case 1334:
return 4.7 //iPhone 6
case 2208:
return 5.5 //iPhone 6 Plus
case 2436:
return 5.8 //iPhone X
case 1792:
return 5.5 //iPhone XR
case 2688:
return 6.5 //iPhone XS Max
default:
let scale = self.scale
let ppi = scale * 163
let width = self.bounds.size.width * scale
let height = self.bounds.size.height * scale
let horizontal = width / ppi, vertical = height / ppi
let diagonal = sqrt(pow(horizontal, 2) + pow(vertical, 2))
return diagonal
}
}
}
これは、「5.5インチ」や「4.7インチ」などの電話のインチサイズを覚えるのは簡単ですが、正確なピクセルサイズを覚えるのが難しいためです。
if UIScreen.main.phoneSizeInInches() == 4 {
//do something with only 4 inch iPhones
}
これにより、次のようなこともできるようになります。
if UIScreen.main.phoneSizeInInches() < 5.5 {
//do something all iPhones smaller than the plus
}
デフォルトは:用途にしようとすると、対角インチを計算するための画面サイズとスケールをしようとします。これは、いくつかの新しいデバイスサイズが表示された場合に備えて、最後の例などのコードが引き続き機能するかどうかを判断するために最善を尽くします。
次のコードを使用します。
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
}
これは、向きに依存しない、デバイスの正しいテストです
- (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;
}
すべてのバージョンのiPhoneおよびiPadデバイスを検出するために使用されます。
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
IS_RETINA
、iPhone 6 plusでテストすると、1xコードが実行されますか?
@1x
、どこでそれが生み出すべきか@3x
。とにかく:コピーして貼り付けるだけなので:-1