iOS iPhone X, iPhone 6 plus, iPhone 6, iPhone 5, iPhone 4 makro ile nasıl algılanır?


111

Cihaz modeli makro ile nasıl tespit edilir? bunun gibi bir şey kullanıyordum ama sonuç her zaman simülatörde IS_IPHONE_5

#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_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)  

sorun sadece eski projelerde mevcut, her şey yeni projelerde (Xcode 6 tarafından oluşturulan) tamam.
phuongho

3
şu şekilde düzeltildi: başlatma ekranı oluştur ve tüm varsayılan başlatma görüntülerini sil
phuongho

1
Gerçek iPhone6 ​​cihazında #define IS_IPHONE_6PLUS (IS_IPHONE && [[UIScreen mainScreen] ölçeği] == 3.0f) kullanmalısınız. NativeScale değil.
Non Umemoto

[[UIScreen mainScreen] nativeScale] == 3.0f (hatta ölçekleme) bir iPhone 6 Plus'ı algılamak için yanlıştır. 6+ üzerinde çalışan ölçekli bir iOS uygulamasındaysanız, bunlar yanlış şeyi bildirecektir. nativeScale asla 3.0 olmayacak - 6 Plus'ta 2.60869'dur (fiziksel ekran gerçek bir 3x olmadığından) Çalışan ortamı tespit etmek için ölçek kullanmak iyidir, ancak cihazın kendisini tespit etmek için diğerini kullanmanız gerekecektir. gibi yöntemler: stackoverflow.com/questions/11197509/…
Shazron

@Milanpatel projenize xib başlatma ekranı ekleyin
phuongho

Yanıtlar:


196

hızlı

import UIKit

public enum DisplayType {
    case unknown
    case iphone4
    case iphone5
    case iphone6
    case iphone6plus
    static let iphone7 = iphone6
    static let iphone7plus = iphone6plus
    case iphoneX
}

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 phone && maxLength == 812 {
            return .iphoneX
        }
        return .unknown
    }
}

Nasıl çalıştığını görün https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346

Not: Örneğin, iPhone 6 yakınlaştırılmış moddaysa, kullanıcı arabirimi iPhone 5'in yakınlaştırılmış bir sürümüdür. Bu işlevler cihaz türünü belirlemez, ancak görüntüleme modu dolayısıyla iPhone 5 bu örnekte istenen sonuçtur.

Objective-C

#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)
#define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0)

Kullanım: http://pastie.org/9687735

Not: Örneğin, iPhone 6 yakınlaştırılmış moddaysa, kullanıcı arabirimi iPhone 5'in yakınlaştırılmış bir sürümüdür. Bu işlevler cihaz türünü belirlemez, ancak görüntüleme modu dolayısıyla iPhone 5 bu örnekte istenen sonuçtur.


3
IS_IPHONE_6 ve IS_IPHONE_6P simülatörde çalışmıyor görünmektedir. Bildirilen maksimum uzunluk 568'dir. Eksik bir şey mi var?
Christopher

6
Yakınlaştırılmış modda mı? İPhone 6 için bir başlatma ekranınız var mı?
hfossli

5
Bu bana genel olarak yanlış bir yön gibi görünüyor. Bu kesinlikle çok uzak olmayan bir gelecekte kırılacak.
Jonny

1
@Jonny: Alternatifler?
test

1
@Jonny: Genel olarak haklısınız, ama modeli veya en azından çözünürlüğü bilseniz bundan faydalanacak bir uygulama biliyorum. Cihaz tipine bağlı olarak bir günün genişliğini uyarlayan takvim uygulamasındaki hafta görünümüdür. Bununla birlikte, aynı anda tam gün sayısı gösterilebilir. Bu çözüm olmadan, diğer günlerin yalnızca bazı kısımlarını görürsünüz.
test

62

Swift için:

struct ScreenSize
{
    static let SCREEN_WIDTH = UIScreen.main.bounds.size.width
    static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
    static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
    static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}

struct DeviceType
{
    static let IS_IPHONE_4_OR_LESS =  UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
    static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
    static let IS_IPHONE_6 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
    static let IS_IPHONE_6P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
}

7
Sadece ithalat UIKit UIUserInterfaceIdiom enum gerek yok,
Vilém Kurz

Uygulamanızı milyonlarca kullanıcıya dağıtmayı planlıyorsanız, bu önerilmez. Cihazın ekran ayarlarında kullanıcı "Yakınlaştır" ı (normal "standart" yerine) etkinleştirdiyse bu sonuçları kontrol edin. Bu durumda bu kod kırılacaktır. Kişisel olarak mcm'nin cevabını kullanmanızı tavsiye ederim.
Deepak Thakur

Çok hoş. Statik izin özellikleri bunu çok verimli kılar!
hfossli

Peki ya iPhone X?
vikzilla

15
#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 )

IS_IPHONE_6_IOS7ve IS_IPHONE_6P_IOS7gerekli değildir, iPhone 6 (+) yalnızca iOS 8 ve üzeri sürümlerde olabilir.
Robert

iphone 6 ve iphone 6 plus'ın yalnızca iOS 8 ve sonraki sürümlerini yükleyebileceğini mi söylüyorsunuz? Ne demek istediğini anlıyor muyum?
Waqas Haider Sheikh

Evet - iPhone 6 (+), iOS 8 ile birlikte gelir ve eski sürüme geçmek mümkün değildir
Robert

.Size.height == 568.0f, iphone 5 yatay
moddayken

Ben de manzara üzerinde test ediyorum ve doğru cevabı veriyor, lütfen detaylı olarak anlatın.
Waqas Haider Sheikh

14
public extension UIDevice {

    var iPhone: Bool {
        return UIDevice().userInterfaceIdiom == .Phone
    }

    enum ScreenType: String {
        case iPhone4
        case iPhone5
        case iPhone6
        case iPhone6Plus
        case Unknown
    }
    var screenType: ScreenType {
        guard iPhone else { return .Unknown}
        switch UIScreen.mainScreen().nativeBounds.height {
        case 960:
            return .iPhone4
        case 1136:
            return .iPhone5
        case 1334:
            return .iPhone6
        case 1920: //fallthrough
            return .iPhone6Plus
        case 2208:
            return .iPhone6Plus
        default:
            return .Unknown
        }
    }

}

1
iPhone 6 Plus için yerel yükseklik 2208 DEĞİL 1920 - Cevabınızı düzelttim.
salocinx

1
+1. nativeBoundskullanmaktan daha iyidir bounds. Ekran Yakınlaştırması açık olan bir iPhone 6, bounds.height için 568, ancak nativeBounds.height için 1334'ü bildirir, ancak Ekran Yakınlaştırması uygulamaların içinde herhangi bir etkiye sahip değildir. ( support.apple.com/en-us/HT203073 )
Christopher Pickslay

@salocinx 1920.0 iPhone 6/7 plus için Xcode'dan bana iade edildi.
Siriss

o zaman burada her iki durumu da kullanmalıyız: - case 1920: fallthrough case 2208: return .iPhone6Plus
kalpesh jetani

1
iPhone plus, cihazda 3X yoğunluğun küçültülmesi nedeniyle fiziksel cihazda 1920 ve simülatörde 2208'dir.
Alessandro Martin

10

Gerçek sistem bilgisini çeken bir sınıf kullanıyorum. Tüm cihaz türlerinin güncel olduğundan emin olmanız yeterlidir.

#import "Macros.h"

@implementation Macros

+ (BOOL)IS_IPHONE_6_PLUS {
    return [[self deviceType] isEqualToString:@"iPhone 6 Plus"] ||  [[self deviceType] isEqualToString:@"iPhone 6S Plus"];
}

+ (BOOL)IS_IPHONE_6 {
    return [[self deviceType] isEqualToString:@"iPhone 6"] || [[self deviceType] isEqualToString:@"iPhone 6S"];
}

+ (BOOL)IS_SIMULATOR {
    return [[self deviceType] isEqualToString:@"32-bit Simulator"]
           || [[self deviceType] isEqualToString:@"64-bit Simulator"];
}

+ (BOOL)IS_IPHONE_5 {
    NSString *device = [self deviceType];
    BOOL result = [device isEqualToString:@"iPhone 5(GSM)"] || [device isEqualToString:@"iPhone 5(GSM+CDMA)"]
                  || [device isEqualToString:@"iPhone 5C(GSM)"] || [device isEqualToString:@"iPhone 5C(GSM+CDMA)"]
                  || [device isEqualToString:@"iPhone 5S(GSM)"] || [device isEqualToString:@"iPhone 5S(GSM+CDMA)"];
    return result;
}

/*
 @"i386"      on 32-bit Simulator
 @"x86_64"    on 64-bit Simulator
 @"iPod1,1"   on iPod Touch
 @"iPod2,1"   on iPod Touch Second Generation
 @"iPod3,1"   on iPod Touch Third Generation
 @"iPod4,1"   on iPod Touch Fourth Generation
 @"iPod5,1"   on iPod Touch Fifth Generation
 @"iPhone1,1" on iPhone
 @"iPhone1,2" on iPhone 3G
 @"iPhone2,1" on iPhone 3GS
 @"iPad1,1"   on iPad
 @"iPad2,1"   on iPad 2
 @"iPad3,1"   on 3rd Generation iPad
 @"iPad3,2":  on iPad 3(GSM+CDMA)
 @"iPad3,3":  on iPad 3(GSM)
 @"iPad3,4":  on iPad 4(WiFi)
 @"iPad3,5":  on iPad 4(GSM)
 @"iPad3,6":  on iPad 4(GSM+CDMA)
 @"iPhone3,1" on iPhone 4
 @"iPhone4,1" on iPhone 4S
 @"iPad3,4"   on 4th Generation iPad
 @"iPad2,5"   on iPad Mini
 @"iPhone5,1" on iPhone 5(GSM)
 @"iPhone5,2" on iPhone 5(GSM+CDMA)
 @"iPhone5,3  on iPhone 5c(GSM)
 @"iPhone5,4" on iPhone 5c(GSM+CDMA)
 @"iPhone6,1" on iPhone 5s(GSM)
 @"iPhone6,2" on iPhone 5s(GSM+CDMA)
 @"iPhone7,1" on iPhone 6 Plus
 @"iPhone7,2" on iPhone 6
 @"iPhone8,1" on iPhone 6  
 @"iPhone8,2" on iPhone 6 Plus ...Yes Apple switched the order...
 */

+ (NSString *)deviceType {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *result = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
        // https://www.theiphonewiki.com/wiki/Models
        NSDictionary *matches = @{
                          @"i386" : @"32-bit Simulator",
                          @"x86_64" : @"64-bit Simulator",

                          @"iPod1,1" : @"iPod Touch",
                          @"iPod2,1" : @"iPod Touch Second Generation",
                          @"iPod3,1" : @"iPod Touch Third Generation",
                          @"iPod4,1" : @"iPod Touch Fourth Generation",
                          @"iPod5,1" : @"iPod Touch Fifth Generation",

                          @"iPad1,1" : @"iPad",
                          @"iPad2,1" : @"iPad 2",
                          @"iPad2,2" : @"iPad 2",
                          @"iPad2,3" : @"iPad 2",
                          @"iPad2,4" : @"iPad 2",
                          @"iPad2,5" : @"iPad Mini",
                          @"iPad2,6" : @"iPad Mini",
                          @"iPad2,7" : @"iPad Mini",
                          @"iPad3,1" : @"iPad 3",
                          @"iPad3,2" : @"iPad 3(GSM+CDMA)",
                          @"iPad3,3" : @"iPad 3(GSM)",
                          @"iPad3,4" : @"iPad 4(WiFi)",
                          @"iPad3,5" : @"iPad 4(GSM)",
                          @"iPad3,6" : @"iPad 4(GSM+CDMA)",
                          @"iPad4,1" : @"iPad Air",
                          @"iPad4,2" : @"iPad Air",
                          @"iPad4,3" : @"iPad Air",
                          @"iPad4,4" : @"iPad Mini 2",
                          @"iPad4,5" : @"iPad Mini 2",
                          @"iPad4,6" : @"iPad Mini 2",
                          @"iPad4,7" : @"iPad Mini 3",
                          @"iPad4,8" : @"iPad Mini 3",
                          @"iPad4,9" : @"iPad Mini 3",
                          @"iPad5,1" : @"iPad Mini 4",
                          @"iPad5,2" : @"iPad Mini 4",
                          @"iPad5,3" : @"iPad Air 2",
                          @"iPad5,4" : @"iPad Air 2",
                          @"iPad6,3" : @"iPad Pro (9.7in)",
                          @"iPad6,4" : @"iPad Pro (9.7in)",
                          @"iPad6,7" : @"iPad Pro (12.9in)",
                          @"iPad6,8" : @"iPad Pro (12.9in)",

                          @"iPhone1,1" : @"iPhone",
                          @"iPhone1,2" : @"iPhone 3G",
                          @"iPhone2,1" : @"iPhone 3GS",
                          @"iPhone3,1" : @"iPhone 4",
                          @"iPhone3,3" : @"iPhone 4",
                          @"iPhone4,1" : @"iPhone 4S",
                          @"iPhone5,1" : @"iPhone 5(GSM)",
                          @"iPhone5,2" : @"iPhone 5(GSM+CDMA)",
                          @"iPhone5,3" : @"iPhone 5C(GSM)",
                          @"iPhone5,4" : @"iPhone 5C(GSM+CDMA)",
                          @"iPhone6,1" : @"iPhone 5S(GSM)",
                          @"iPhone6,2" : @"iPhone 5S(GSM+CDMA)",
                          @"iPhone7,1" : @"iPhone 6 Plus",
                          @"iPhone7,2" : @"iPhone 6",
                          @"iPhone8,1" : @"iPhone 6S",
                          @"iPhone8,2" : @"iPhone 6S Plus",
                          @"iPhone8,4" : @"iPhone SE",
                          @"iPhone9,1" : @"iPhone 7",
                          @"iPhone9,3" : @"iPhone 7",
                          @"iPhone9,2" : @"iPhone 7 Plus",
                          @"iPhone9,4" : @"iPhone 7 Plus",
                          };

    if (matches[result]) {
        return matches[result];
    } else {
        return result;
    }
}

@end

3
#import <sys / utsname.h>
Deepak Thakur

7

Bir Başlatma Ekranı ayarladığınızda hatanın ortadan kalktığını onaylayabilirim.

Başlatma görüntülerimi sakladım ve MainStoryboard'u Başlatma Ekranına ekledim ve simülatör cihazları doğru şekilde tanıdı.


Bunu, arabasını başlatma ekranı olmayan eski projeler için kabul edin. Başlatma Ekranı çözdü.
BHuelse

6

Kodunuzu cihaz türlerine bağlamamak daha iyidir. Bu, esnek olmayan kıvrımlı birine yol açacaktır. Apple, cihazları değil boyutları düşünmenizi istiyor. İPhone 5'ten büyük cihazlar için görüntü veya yazı tipi boyutları gibi özel boyutlara sahip olmanız gerektiğinde, iPhone 5 ekranı arasındaki ilişkiye göre temel boyutunuzu belirli bir yüzde oranında büyüten bir çarpan ile normalize sınıfı oluşturmanızı tavsiye ederim. genişlik ve mevcut cihaz boyutu.

let BaseWidth : CGFloat = 320

class Normalizer: NSObject {
    //scale value proportional to the screen width
    class func normalize(value:CGFloat,multiplier : CGFloat = 1,maxDelta:CGFloat = 1024) -> CGFloat{
        let screenWidth = UIScreen.mainScreen().bounds.size.width
        let percent = (screenWidth - BaseWidth)/screenWidth
        let normalizedValue = value * (1 + percent) * multiplier
        return min(normalizedValue, value + maxDelta)//capped by a max value if needed
    } 
}

Yani kodunuzda şöyle bir şey yapacaksınız:

value = Normalizer.normalize(30)

Neden a ile bir struct kullanmıyorsunuz static normalize?
Kalzem

Bu da işe
yaramalı

6

Swift 3+ sözdizimine sahip UIDeivce uzantısı .

public extension UIDevice {

    var iPhone: Bool {
        return UIDevice().userInterfaceIdiom == .phone
    }

    enum ScreenType: String {
        case iPhone4
        case iPhone5
        case iPhone6
        case iPhone6Plus
        case iPhoneX
        case Unknown
    }
    var screenType: ScreenType {
        guard iPhone else { return .Unknown}
        switch UIScreen.main.nativeBounds.height {
        case 960:
            return .iPhone4
        case 1136:
            return .iPhone5
        case 1334:
            return .iPhone6
        case 2208, 1920:
            return .iPhone6Plus
        case 2436:
            return .iPhoneX
        default:
            return .Unknown
        }
    }

}

Örnek kullanım:

switch UIDevice().screenType {
        case .iPhone4, .iPhone5:
            // Code for iPhone 4 & iPhone 5
            break
        case .iPhone6:
            // Code for iPhone 6 & iPhone 7
            break
        case .iPhone6Plus:
            // Code for iPhone 6 Plus & iPhone 7 Plus
            break
        case .iPhoneX:
            // Code for iPhone X
            break
        default:
            break
        }

Orijinal cevap: https://stackoverflow.com/a/36479017/3659227


5

Xcode 11 / Swift 5.1'i güncelleyin:

enum UIUserInterfaceIdiom : Int
{
    case Unspecified
    case Phone
    case Pad
}

struct ScreenSize
{
    static let SCREEN_WIDTH         = UIScreen.main.bounds.size.width
    static let SCREEN_HEIGHT        = UIScreen.main.bounds.size.height
    static let SCREEN_MAX_LENGTH    = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
    static let SCREEN_MIN_LENGTH    = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}

struct DeviceType
{
    static let IS_IPHONE_4_OR_LESS  = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
    static let IS_IPHONE_5          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
    static let IS_IPHONE_6_8        = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
    static let IS_IPHONE_6_8P       = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
    static let IS_IPHONE_X          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812.0
    static let IS_IPHONE_11_PRO     = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812.0
    static let IS_IPHONE_XR_SMAX    = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 896.0
    static let IS_IPHONE_XS_MAX     = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 896.0
    static let IS_IPHONE_11         = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 896.0
    static let IS_IPHONE_11_PRO_MAX = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 896.0
    static let IS_IPAD              = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0
    static let IS_IPAD_PRO10        = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1112.0
    static let IS_IPAD_PRO12        = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0
    static let IS_IPAD_ALL          = UIDevice.current.userInterfaceIdiom == .pad

    static let IS_IPHONE_NOTCH_DEVICE = (UIDevice.current.userInterfaceIdiom == .phone) && (ScreenSize.SCREEN_MAX_LENGTH == 896.0 || ScreenSize.SCREEN_MAX_LENGTH == 812.0)
}

struct Version{
    static let SYS_VERSION_FLOAT = (UIDevice.current.systemVersion as NSString).floatValue
    static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0 && Version.SYS_VERSION_FLOAT < 10.0)
    static let iOS10 = (Version.SYS_VERSION_FLOAT >= 10.0 && Version.SYS_VERSION_FLOAT < 11.0)
    static let iOS11 = (Version.SYS_VERSION_FLOAT >= 11.0 && Version.SYS_VERSION_FLOAT < 12.0)
    static let iOS12 = (Version.SYS_VERSION_FLOAT >= 12.0 && Version.SYS_VERSION_FLOAT < 13.0)
    static let iOS13 = (Version.SYS_VERSION_FLOAT >= 13.0)
}

struct VersionAndNewer {
    static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0)
    static let iOS10 = (Version.SYS_VERSION_FLOAT >= 10.0)
    static let iOS11 = (Version.SYS_VERSION_FLOAT >= 11.0)
    static let iOS12 = (Version.SYS_VERSION_FLOAT >= 12.0)
    static let iOS13 = (Version.SYS_VERSION_FLOAT >= 13.0)
}

Merhaba, Xcode10 / Swift 4.2'ye ve iPhone XS / XSMAX / XR için yeni boyutlara güncellendi

Notch-IPhones tespiti ile.

Umarım bu birine yardımcı olur.

enum UIUserInterfaceIdiom : Int
{
    case Unspecified
    case Phone
    case Pad

}

struct ScreenSize
{
    static let SCREEN_WIDTH         = UIScreen.main.bounds.size.width
    static let SCREEN_HEIGHT        = UIScreen.main.bounds.size.height
    static let SCREEN_MAX_LENGTH    = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
    static let SCREEN_MIN_LENGTH    = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}

struct DeviceType
{
    static let IS_IPHONE_4_OR_LESS  = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
    static let IS_IPHONE_5          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
    static let IS_IPHONE_6_8        = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
    static let IS_IPHONE_6_8P       = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
    static let IS_IPHONE_X          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812.0
    static let IS_IPHONE_XR_SMAX    = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 896.0
    static let IS_IPAD              = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0
    static let IS_IPAD_PRO10        = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1112.0
    static let IS_IPAD_PRO12        = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0

    static let IS_IPHONE_NOTCH_DEVICE = (UIDevice.current.userInterfaceIdiom == .phone) && (ScreenSize.SCREEN_MAX_LENGTH == 896.0 || ScreenSize.SCREEN_MAX_LENGTH == 812.0)
}

struct Version{
    static let SYS_VERSION_FLOAT = (UIDevice.current.systemVersion as NSString).floatValue
    static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0 && Version.SYS_VERSION_FLOAT < 10.0)
    static let iOS10 = (Version.SYS_VERSION_FLOAT >= 10.0 && Version.SYS_VERSION_FLOAT < 11.0)
    static let iOS11 = (Version.SYS_VERSION_FLOAT >= 11.0 && Version.SYS_VERSION_FLOAT < 12.0)
    static let iOS12 = (Version.SYS_VERSION_FLOAT >= 12.0)
}

struct VersionAndNewer {
    static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0)
    static let iOS10 = (Version.SYS_VERSION_FLOAT >= 10.0)
    static let iOS11 = (Version.SYS_VERSION_FLOAT >= 11.0)
    static let iOS12 = (Version.SYS_VERSION_FLOAT >= 12.0)

}


1
//Device Type enum
enum DeviceType: Int {

//Apple UnknownDevices
case UnknownDevice = 0

//Simulator
case Simulator

//Apple Air pods
case AppleAirPods

//Apple TV
case AppleTV2G
case AppleTV3G
case AppleTV4G
case AppleTV4K

//Apple Watch
case AppleWatch
case AppleWatchSeries1
case AppleWatchSeries2
case AppleWatchSeries3

//Apple Home Pods
case AppleHomePods

//Apple iPad
case AppleIpad
case AppleIpad2
case AppleIpad3
case AppleIpad4
case AppleIpadAir
case AppleIpadAir2
case AppleIpadPro_12_9
case AppleIpadPro_9_7
case AppleIpad5
case AppleIpadPro_12_9_Gen_2
case AppleIpadPro_10_5
case AppleIpadMini
case AppleIpadMini2
case AppleIpadMini3
case AppleIpadMini4

//Apple iPhone
case AppleIphone
case AppleIphone3G
case AppleIphone3GS
case AppleIphone4
case AppleIphone4S
case AppleIphone5
case AppleIphone5C
case AppleIphone5S
case AppleIphone6
case AppleIphone6P
case AppleIphone6S
case AppleIphone6SP
case AppleIphoneSE
case AppleIphone7
case AppleIphone7P
case AppleIphone8
case AppleIphone8P
case AppleIphoneX

//Apple iPod touch
case AppleIpodTouch
case AppleIpodTouch2G
case AppleIpodTouch3G
case AppleIpodTouch4G
case AppleIpodTouch5G
case AppleIpodTouch6G
}

// Method for device type
func getDeviceType() -> DeviceType{
    var systemInfo = utsname()
    uname(&systemInfo)
    let machineMirror = Mirror(reflecting: systemInfo.machine)
    let identifier = machineMirror.children.reduce("") { identifier, element in
        guard let value = element.value as? Int8, value != 0 else { return identifier }
        return identifier + String(UnicodeScalar(UInt8(value)))
    }

    switch identifier {

    //Simulator
    case "i386","x86_64": return .Simulator

    //Apple Air Pods
    case "AirPods1,1": return .AppleAirPods

    //Apple TV
    case "AppleTV2,1": return .AppleTV2G
    case "AppleTV3,1", "AppleTV3,2": return .AppleTV3G
    case "AppleTV5,3": return .AppleTV4G
    case "AppleTV6,2": return .AppleTV4K

    //Apple Watch
    case "Watch1,1", "Watch1,2": return .AppleWatch
    case "Watch2,6", "Watch2,7": return .AppleWatchSeries1
    case "Watch2,3", "Watch2,4": return .AppleWatchSeries2
    case "Watch3,1", "Watch3,2", "Watch3,3", "Watch3,4": return .AppleWatchSeries3

    // Apple HomePods
    case "AudioAccessory1,1": return .AppleHomePods

    //Apple iPad
    case "iPad1,1": return .AppleIpad
    case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4": return .AppleIpad2
    case "iPad3,1", "iPad3,2", "iPad3,3": return .AppleIpad3
    case "iPad3,4", "iPad3,5", "iPad3,6": return .AppleIpad4
    case "iPad4,1", "iPad4,2", "iPad4,3": return .AppleIpadAir
    case "iPad5,3", "iPad5,4": return .AppleIpadAir2
    case "iPad6,7", "iPad6,8": return .AppleIpadPro_12_9
    case "iPad6,3", "iPad6,4": return .AppleIpadPro_9_7
    case "iPad6,11", "iPad6,12": return .AppleIpad5
    case "iPad7,1", "iPad7,2" : return .AppleIpadPro_12_9_Gen_2
    case "iPad7,3", "iPad7,4" : return .AppleIpadPro_10_5
    case "iPad2,5", "iPad2,6", "iPad2,7": return .AppleIpadMini
    case "iPad4,4", "iPad4,5", "iPad4,6": return .AppleIpadMini2
    case "iPad4,7", "iPad4,8", "iPad4,9": return .AppleIpadMini3
    case "iPad5,1", "iPad5,2": return .AppleIpadMini4

    //Apple iPhone
    case "iPhone1,1": return .AppleIphone
    case "iPhone1,2": return .AppleIphone3G
    case "iPhone2,1": return .AppleIphone3GS
    case "iPhone3,1", "iPhone3,2", "iPhone3,3": return .AppleIphone4
    case "iPhone4,1": return .AppleIphone4S
    case "iPhone5,1", "iPhone5,2": return .AppleIphone5
    case "iPhone5,3", "iPhone5,4": return .AppleIphone5C
    case "iPhone6,1", "iPhone6,2": return .AppleIphone5S
    case "iPhone7,2": return .AppleIphone6
    case "iPhone7,1": return .AppleIphone6P
    case "iPhone8,1": return .AppleIphone6S
    case "iPhone8,2": return .AppleIphone6SP
    case "iPhone8,4": return .AppleIphoneSE
    case "iPhone9,1", "iPhone9,3": return .AppleIphone7
    case "iPhone9,2", "iPhone9,4": return .AppleIphone7P
    case "iPhone10,1", "iPhone10,4": return .AppleIphone8
    case "iPhone10,2", "iPhone10,5": return .AppleIphone8P
    case "iPhone10,3", "iPhone10,6": return .AppleIphoneX

    //Apple iPod touch
    case "iPod1,1": return .AppleIpodTouch
    case "iPod2,1": return .AppleIpodTouch2G
    case "iPod3,1": return .AppleIpodTouch3G
    case "iPod4,1": return .AppleIpodTouch4G
    case "iPod5,1": return .AppleIpodTouch5G
    case "iPod7,1": return .AppleIpodTouch6G

    default:
        return .UnknownDevice
    }
}

0

Artı olarak, yakınlaştırmayı da kontrol etmelisiniz

struct DeviceType
{
    static let IS_IPHONE = (UIDevice.current.userInterfaceIdiom == .phone)
    static let IS_IPHONE_4_OR_LESS =  UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
    static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
    static let IS_IPHONE_6_7 = (UIDevice.current.userInterfaceIdiom == .phone) && (ScreenSize.SCREEN_MAX_LENGTH == 667.0) && (UIScreen.main.nativeScale >= UIScreen.main.scale)
    private static let IS_STANDARD_IPHONE_6P_7P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
    private static let IS_ZOOMED_IPHONE_6P_7P = (UIDevice.current.userInterfaceIdiom == .phone) && (ScreenSize.SCREEN_MAX_LENGTH == 667.0) && (UIScreen.main.nativeScale < UIScreen.main.scale)
    static let IS_IPHONE_6P_7P = IS_STANDARD_IPHONE_6P_7P || IS_ZOOMED_IPHONE_6P_7P
}

0
import Foundation
import UIKit

public enum IADisplayType {
    // unknow device
    case        unspecified
    // iPhone
    case        unknowiPhone
    case        iPhone3GS
    case        iPhone4
    static let  iPhone4s            = iPhone5
    case        iPhone5
    static let  iPhone5s            = iPhone5
    static let  iPhoneSE            = iPhone5
    case        iPhone6
    case        iPhone6Plus
    static let  iPhone6s            = iPhone6
    static let  iPhone6sPlus        = iPhone6Plus
    static let  iPhone7             = iPhone6
    static let  iPhone7Plus         = iPhone6Plus
    static let  iPhone8             = iPhone6
    static let  iPhone8Plus         = iPhone6Plus
    case        iPhoneX
    // iPad
    case        unknowiPad
    case        iPad79
    static let  iPad97              = iPad79
    case        iPad105
    case        iPad129
    // Apple CarPlay
    case        carPlay
    // Apple TV
    case        tv
}

public final class IADisplayManager {

    // MARK: - public interface
    // singleton
    static var shared: IADisplayManager {
        get {
            return IADisplayManager()
        }
    }

    // get current device type
    public var currentType: IADisplayType {
        get {
            return calCurrentType()
        }
    }

    // device current Native Resolution
    public var nativeResolution: CGSize {
        get {
            return UIScreen.main.nativeBounds.size
        }
    }

    // device current Native Scale Factor
    public var nativeScaleFactor: CGFloat {
        get {
            return UIScreen.main.nativeScale
        }
    }

    // device current Interface Idiom
    public var interfaceIdiom: UIUserInterfaceIdiom {
        get {
            return UIDevice().userInterfaceIdiom
        }
    }

    fileprivate init() {}

    // MARK: - private interface
    fileprivate func calCurrentType() -> IADisplayType {
        typealias Type = IADisplayType

        // unknown device
        if interfaceIdiom == .unspecified { return Type.unspecified }
        // iPhone && iPod Touch
        else if interfaceIdiom == .phone {
            if nativeScaleFactor == 1.0 && nativeResolution == CGSize(width: 320, height: 480) { return Type.iPhone3GS }
            else if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 640, height: 960) { return Type.iPhone4 }
            else if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 640, height: 1136) { return Type.iPhone5 }
            else if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 750, height: 1334) { return Type.iPhone6 }
            else if (nativeScaleFactor-2.608) < 0.001 && nativeResolution == CGSize(width: 1080, height: 1920) { return Type.iPhone6Plus }
            else if nativeScaleFactor == 3.0 && nativeResolution == CGSize(width: 1125, height: 2436) { return Type.iPhoneX }
            else { return Type.unknowiPhone }
        }
        // iPad
        else if interfaceIdiom == .pad {
            if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 1536, height: 2048) { return Type.iPad79 }
            else if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 2224, height: 1668) { return Type.iPad105 }
            else if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 2048, height: 2732) { return Type.iPad129 }
            else { return Type.unknowiPad }
        }
        // Apple CarPlay
        else if interfaceIdiom == .carPlay { return Type.carPlay }
        // Apple TV
        else if interfaceIdiom == .tv { return Type.tv }
        // unknown device
        else { return Type.unspecified }
    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.