2015-01-05 14 views

risposta

77

Xcode 9 • Swift 4

extension UIDevice { 
    var iPhoneX: Bool { 
     return UIScreen.main.nativeBounds.height == 2436 
    } 
    var iPhone: Bool { 
     return UIDevice.current.userInterfaceIdiom == .phone 
    } 
    enum ScreenType: String { 
     case iPhone4_4S = "iPhone 4 or iPhone 4S" 
     case iPhones_5_5s_5c_SE = "iPhone 5, iPhone 5s, iPhone 5c or iPhone SE" 
     case iPhones_6_6s_7_8 = "iPhone 6, iPhone 6S, iPhone 7 or iPhone 8" 
     case iPhones_6Plus_6sPlus_7Plus_8Plus = "iPhone 6 Plus, iPhone 6S Plus, iPhone 7 Plus or iPhone 8 Plus" 
     case iPhoneX = "iPhone X" 
     case unknown 
    } 
    var screenType: ScreenType { 
     switch UIScreen.main.nativeBounds.height { 
     case 960: 
      return .iPhone4_4S 
     case 1136: 
      return .iPhones_5_5s_5c_SE 
     case 1334: 
      return .iPhones_6_6s_7_8 
     case 1920, 2208: 
      return .iPhones_6Plus_6sPlus_7Plus_8Plus 
     case 2436: 
      return .iPhoneX 
     default: 
      return .unknown 
     } 
    } 
} 

print("screenType:", UIDevice.current.screenType.rawValue) 
+0

perché non usare altro se, o meglio ancora nominare le altezze usando un enum o un simile? –

+0

quanto è diverso 'nativeBounds' da' bounds'? Il documento diceva 'var nativeBounds: CGRect {get} // Limiti nativi dello schermo fisico in pixel', ma non capisco davvero la differenza. – Hlung

+2

Pixel indica il numero di pixel effettivi che il telefono può visualizzare. I limiti sono l'area effettiva che devi disegnare in punti (molto meno dei pixel effettivi) –

19

soluzione alternativa con estensione UIScreen (IOS 8 e successive):

extension UIScreen { 

    enum SizeType: CGFloat { 
     case Unknown = 0.0 
     case iPhone4 = 960.0 
     case iPhone5 = 1136.0 
     case iPhone6 = 1334.0 
     case iPhone6Plus = 1920.0 
    } 

    var sizeType: SizeType { 
     let height = nativeBounds.height 
     guard let sizeType = SizeType(rawValue: height) else { return .Unknown } 
     return sizeType 
    } 
} 

Usage:

if UIScreen.mainScreen().sizeType == .iPhone4 { 
    // Make specific layout for small devices. 
} 
2
if UIDevice().userInterfaceIdiom == .Phone { 
    switch UIScreen.mainScreen().bounds.size.height{ 
    case 480: 
     print("iPhone 4S") 
    case 568: 
     print("iPhone 5") 
    default: 
     print("other models") 
    } 
} 

UIScreen.mainScreen(). Bounds.size.height fornirà l'altezza del dispositivo. Usando questo valore possiamo controllare il particolare dispositivo iphone.

+0

Dovresti usare nativeBounds. Il risultato della proprietà Bounds dipende dall'orientamento del dispositivo. –

+0

@LeoDabus Qual è la differenza tra NativeBounds e limiti. –

+0

BOUNDS: questo rettangolo viene specificato nello spazio di coordinate corrente, che tiene conto di tutte le rotazioni dell'interfaccia in vigore per il dispositivo. Pertanto, il valore di questa proprietà può cambiare quando il dispositivo ruota tra l'orientamento verticale e orizzontale. –

3

solo per aggiungere al https://stackoverflow.com/a/27776671/1766242

consente di scrivere

if UIDevice.isScreen35inch() { 
    // Do something to fit small screen 
} else { 
    // do something else for larger screens 
} 

Vedere sotto

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 nil } 
    switch UIScreen.mainScreen().nativeBounds.height { 
    case 960: 
     return .iPhone4 
    case 1136: 
     return .iPhone5 
    case 1334: 
     return .iPhone6 
    case 2208: 
     return .iPhone6Plus 
    default: 
     return nil 
    } 
} 

// helper funcs 
static func isScreen35inch() -> Bool { 
    return UIDevice().screenType == .iPhone4 
} 

func isScreen4inch() -> Bool { 
    return UIDevice().screenType == .iPhone5 
} 

func isScreen47inch() -> Bool { 
    return UIDevice().screenType == .iPhone6 
} 

func isScreen55inch() -> Bool { 
    return UIDevice().screenType == .iPhone6Plus 
}} 
1

Oltre al modo proposto, Un modo per farlo è quello di utilizzare la struct nel modo seguente.

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 
    static let IS_IPAD    = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0 
    static let IS_IPAD_PRO   = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0 
} 

Fammi sapere se è utile.

0

Si può anche provare questo codice qui sotto:

if (IS_IPHONE4) { 
     imgHeight.constant = 150; 
    } 
    else if (IS_IPAD) { 
     imgHeight.constant = 300; 
    } 
    else if (IS_IPHONE5) { 
     imgHeight.constant = 170; 
    } 
    else { 
     imgHeight.constant = 200; 
    } 

Grazie.

Problemi correlati