Skip to content

Instantly share code, notes, and snippets.

@imkevinxu
Last active March 4, 2023 16:09
Show Gist options
  • Star 66 You must be signed in to star a gist
  • Fork 16 You must be signed in to fork a gist
  • Save imkevinxu/2bb1197552b095ab25c8 to your computer and use it in GitHub Desktop.
Save imkevinxu/2bb1197552b095ab25c8 to your computer and use it in GitHub Desktop.
iOS device checks for OS version and screen size in Swift
//
// Device.swift
// imHome
//
// Created by Kevin Xu on 2/9/15. Updated on 6/20/15.
// Copyright (c) 2015 Alpha Labs, Inc. All rights reserved.
//
import Foundation
// MARK: - Device Structure
struct Device {
// MARK: - Singletons
static var TheCurrentDevice: UIDevice {
struct Singleton {
static let device = UIDevice.currentDevice()
}
return Singleton.device
}
static var TheCurrentDeviceVersion: Float {
struct Singleton {
static let version = UIDevice.currentDevice().systemVersion.floatValue
}
return Singleton.version
}
static var TheCurrentDeviceHeight: CGFloat {
struct Singleton {
static let height = UIScreen.mainScreen().bounds.size.height
}
return Singleton.height
}
// MARK: - Device Idiom Checks
static var PHONE_OR_PAD: String {
if isPhone() {
return "iPhone"
} else if isPad() {
return "iPad"
}
return "Not iPhone nor iPad"
}
static var DEBUG_OR_RELEASE: String {
#if DEBUG
return "Debug"
#else
return "Release"
#endif
}
static var SIMULATOR_OR_DEVICE: String {
#if (arch(i386) || arch(x86_64)) && os(iOS)
return "Simulator"
#else
return "Device"
#endif
}
static var CURRENT_DEVICE: String {
return GBDeviceInfo.deviceInfo().modelString
}
static func isPhone() -> Bool {
return TheCurrentDevice.userInterfaceIdiom == .Phone
}
static func isPad() -> Bool {
return TheCurrentDevice.userInterfaceIdiom == .Pad
}
static func isDebug() -> Bool {
return DEBUG_OR_RELEASE == "Debug"
}
static func isRelease() -> Bool {
return DEBUG_OR_RELEASE == "Release"
}
static func isSimulator() -> Bool {
return SIMULATOR_OR_DEVICE == "Simulator"
}
static func isDevice() -> Bool {
return SIMULATOR_OR_DEVICE == "Device"
}
// MARK: - Device Version Checks
enum Versions: Float {
case Five = 5.0
case Six = 6.0
case Seven = 7.0
case Eight = 8.0
case Nine = 9.0
}
static func isVersion(version: Versions) -> Bool {
return TheCurrentDeviceVersion >= version.rawValue && TheCurrentDeviceVersion < (version.rawValue + 1.0)
}
static func isVersionOrLater(version: Versions) -> Bool {
return TheCurrentDeviceVersion >= version.rawValue
}
static func isVersionOrEarlier(version: Versions) -> Bool {
return TheCurrentDeviceVersion < (version.rawValue + 1.0)
}
static var CURRENT_VERSION: String {
return "\(TheCurrentDeviceVersion)"
}
// MARK: iOS 5 Checks
static func IS_OS_5() -> Bool {
return isVersion(.Five)
}
static func IS_OS_5_OR_LATER() -> Bool {
return isVersionOrLater(.Five)
}
static func IS_OS_5_OR_EARLIER() -> Bool {
return isVersionOrEarlier(.Five)
}
// MARK: iOS 6 Checks
static func IS_OS_6() -> Bool {
return isVersion(.Six)
}
static func IS_OS_6_OR_LATER() -> Bool {
return isVersionOrLater(.Six)
}
static func IS_OS_6_OR_EARLIER() -> Bool {
return isVersionOrEarlier(.Six)
}
// MARK: iOS 7 Checks
static func IS_OS_7() -> Bool {
return isVersion(.Seven)
}
static func IS_OS_7_OR_LATER() -> Bool {
return isVersionOrLater(.Seven)
}
static func IS_OS_7_OR_EARLIER() -> Bool {
return isVersionOrEarlier(.Seven)
}
// MARK: iOS 8 Checks
static func IS_OS_8() -> Bool {
return isVersion(.Eight)
}
static func IS_OS_8_OR_LATER() -> Bool {
return isVersionOrLater(.Eight)
}
static func IS_OS_8_OR_EARLIER() -> Bool {
return isVersionOrEarlier(.Eight)
}
// MARK: iOS 9 Checks
static func IS_OS_9() -> Bool {
return isVersion(.Nine)
}
static func IS_OS_9_OR_LATER() -> Bool {
return isVersionOrLater(.Nine)
}
static func IS_OS_9_OR_EARLIER() -> Bool {
return isVersionOrEarlier(.Nine)
}
// MARK: - Device Size Checks
enum Heights: CGFloat {
case Inches_3_5 = 480
case Inches_4 = 568
case Inches_4_7 = 667
case Inches_5_5 = 736
}
static func isSize(height: Heights) -> Bool {
return TheCurrentDeviceHeight == height.rawValue
}
static func isSizeOrLarger(height: Heights) -> Bool {
return TheCurrentDeviceHeight >= height.rawValue
}
static func isSizeOrSmaller(height: Heights) -> Bool {
return TheCurrentDeviceHeight <= height.rawValue
}
static var CURRENT_SIZE: String {
if IS_3_5_INCHES() {
return "3.5 Inches"
} else if IS_4_INCHES() {
return "4 Inches"
} else if IS_4_7_INCHES() {
return "4.7 Inches"
} else if IS_5_5_INCHES() {
return "5.5 Inches"
}
return "\(TheCurrentDeviceHeight) Points"
}
// MARK: Retina Check
static func IS_RETINA() -> Bool {
return UIScreen.mainScreen().respondsToSelector("scale")
}
// MARK: 3.5 Inch Checks
static func IS_3_5_INCHES() -> Bool {
return isPhone() && isSize(.Inches_3_5)
}
static func IS_3_5_INCHES_OR_LARGER() -> Bool {
return isPhone() && isSizeOrLarger(.Inches_3_5)
}
static func IS_3_5_INCHES_OR_SMALLER() -> Bool {
return isPhone() && isSizeOrSmaller(.Inches_3_5)
}
// MARK: 4 Inch Checks
static func IS_4_INCHES() -> Bool {
return isPhone() && isSize(.Inches_4)
}
static func IS_4_INCHES_OR_LARGER() -> Bool {
return isPhone() && isSizeOrLarger(.Inches_4)
}
static func IS_4_INCHES_OR_SMALLER() -> Bool {
return isPhone() && isSizeOrSmaller(.Inches_4)
}
// MARK: 4.7 Inch Checks
static func IS_4_7_INCHES() -> Bool {
return isPhone() && isSize(.Inches_4_7)
}
static func IS_4_7_INCHES_OR_LARGER() -> Bool {
return isPhone() && isSizeOrLarger(.Inches_4_7)
}
static func IS_4_7_INCHES_OR_SMALLER() -> Bool {
return isPhone() && isSizeOrLarger(.Inches_4_7)
}
// MARK: 5.5 Inch Checks
static func IS_5_5_INCHES() -> Bool {
return isPhone() && isSize(.Inches_5_5)
}
static func IS_5_5_INCHES_OR_LARGER() -> Bool {
return isPhone() && isSizeOrLarger(.Inches_5_5)
}
static func IS_5_5_INCHES_OR_SMALLER() -> Bool {
return isPhone() && isSizeOrLarger(.Inches_5_5)
}
// MARK: - International Checks
static var CURRENT_REGION: String {
return NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as! String
}
}
@AndreiBoariu
Copy link

Nice class, and very useful.. Thanks man

@vesakk
Copy link

vesakk commented Sep 1, 2015

Very nice! Thank you!

@KimBin
Copy link

KimBin commented Oct 20, 2015

what's meaning of "GBDeviceInfo"

@oddmagne
Copy link

I get two errors during compile.

        static let version = UIDevice.currentDevice().systemVersion.floatValue

error: "Value of type 'String' has no member 'floatValue'"

    return GBDeviceInfo.deviceInfo().modelString

error: "Use of unresolved identifier 'GBDeviceInfo'"

@vitorspencer
Copy link

@KimBin and @oddmagne:
replace
static let version = UIDevice.currentDevice().systemVersion.floatValue
with
static let version = (UIDevice.currentDevice().systemVersion as NSString).floatValue

Also add https://github.com/lmirosevic/GBDeviceInfo to your project.

@imkevinxu: very cool utility! Thanks a lot :)

@norsez
Copy link

norsez commented Jan 12, 2016

Very handy. Love this. Thanks.

@brandonscript
Copy link

Works great, except from what I can see deviceHeight only works if the device is in portrait; otherwise in landscape, you'll get the height of the display (which is the width of the device).

static var TheCurrentDeviceHeight: CGFloat {
    struct Singleton {
        static let height = max(UIScreen.mainScreen().bounds.size.height, UIScreen.mainScreen().bounds.size.width)
    }
    return Singleton.height
}

... should do it

@dipottor
Copy link

Very useful utility .. Thank you

@sourleangchhean168
Copy link

Great. very useful...

@smartkuk
Copy link

i love it!

@RodrigoLGuimaraes
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment