-
-
Save imkevinxu/2bb1197552b095ab25c8 to your computer and use it in GitHub Desktop.
// | |
// 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 | |
} | |
} |
what's meaning of "GBDeviceInfo"
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'"
@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
Very nice! Thank you!