Skip to content

Instantly share code, notes, and snippets.

@imkevinxu
Last active March 4, 2023 16:09
Show Gist options
  • Select an option

  • Save imkevinxu/2bb1197552b095ab25c8 to your computer and use it in GitHub Desktop.

Select an option

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.
// Copyright (c) 2015 Alpha Labs, Inc. All rights reserved.
//
import Foundation
// MARK: - Device Structure
struct Device {
// MARK: - Singletons
static var currentDevice: UIDevice {
struct Singleton {
static let device = UIDevice.currentDevice()
}
return Singleton.device
}
static var currentDeviceVersion: Float {
struct Singleton {
static let version = UIDevice.currentDevice().systemVersion.floatValue
}
return Singleton.version
}
static var currentDeviceHeight: CGFloat {
struct Singleton {
static let height = UIScreen.mainScreen().bounds.size.height
}
return Singleton.height
}
// MARK: - Device Idiom Checks
static func isPhone() -> Bool {
return currentDevice.userInterfaceIdiom == .Phone
}
static func isPad() -> Bool {
return currentDevice.userInterfaceIdiom == .Pad
}
// MARK: - Device Version Checks
enum Versions: Float {
case Five = 5.0
case Six = 6.0
case Seven = 7.0
case Eight = 8.0
}
static func isVersion(version: Versions) -> Bool {
return currentDeviceVersion >= version.rawValue && currentDeviceVersion < (version.rawValue + 1.0)
}
static func isVersionOrLater(version: Versions) -> Bool {
return currentDeviceVersion >= version.rawValue
}
static func isVersionOrEarlier(version: Versions) -> Bool {
return currentDeviceVersion < (version.rawValue + 1.0)
}
// 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: - 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 currentDeviceHeight == height.rawValue
}
static func isSizeOrLarger(height: Heights) -> Bool {
return currentDeviceHeight >= height.rawValue
}
static func isSizeOrSmaller(height: Heights) -> Bool {
return currentDeviceHeight <= height.rawValue
}
// 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)
}
}
@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