Last active
March 4, 2023 16:09
-
-
Save imkevinxu/2bb1197552b095ab25c8 to your computer and use it in GitHub Desktop.
iOS device checks for OS version and screen size in Swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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 | |
} | |
} |
@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 :)
Very handy. Love this. Thanks.
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
Very useful utility .. Thank you
Great. very useful...
i love it!
Ported it to Swift4: https://gist.github.com/RodrigoLGuimaraes/90086a28107809f58a0133e3e11419d3
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I get two errors during compile.
error: "Value of type 'String' has no member 'floatValue'"
error: "Use of unresolved identifier 'GBDeviceInfo'"