Created
July 28, 2019 18:35
-
-
Save DominikBucher12/d33f88ee5ac47a54fd5fd589f371dfce to your computer and use it in GitHub Desktop.
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
public extension UIDevice { | |
/// This enum gives us simple way how to recognize which UIDevice size | |
/// | |
/// For the resolutions, refer to | |
/// Apple official website: | |
/// https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/Displays/Displays.html | |
/// Because the documentation is missing, I ran simulators and manually checked some resolutions on | |
/// `UIScreen.main.bounds` (for Xr, XS Max and 11-inch iPhones) Apple somehow doesn't update the documentation. | |
enum DeviceSize: CaseIterable { | |
// iPhones: | |
case iPhoneX // XS | |
case iPhoneXSMax // Fun fact: Xr has same logical resolution as XS Max. | |
// https://stackoverflow.com/a/52425261/5774854 | |
case iPhone8Plus // Since iPhone 6+, this works for all of our screens | |
case iPhone8 // Since iPhone 6, this works for all of our screens | |
case iPhoneSE // iPhone 5, 5S... SE 2 maybe? 🚀 | |
case iPhone4 // 4S | |
// iPads: | |
case iPadAir // Also known as: iPad 3, iPad 4, iPad Air, iPad Air 2, 9.7-inch iPad Pro | |
// iPad Minis have same logical resolutions, but are different in PPI (higher) and physical display. | |
// I expect them to behave the same in same logical resolutions. | |
case iPadPro10AndHalfInch | |
case iPadPro11Inch | |
case iPadPro12Point9Inch | |
var size: CGSize { | |
switch self { | |
// iPhones | |
case .iPhoneX: | |
return .init(width: 375, height: 812) | |
case .iPhoneXSMax: | |
return .init(width: 414, height: 896) | |
case .iPhone8Plus: | |
return .init(width: 414, height: 736) | |
case .iPhone8: | |
return .init(width: 375, height: 667) | |
case .iPhoneSE: | |
return .init(width: 320, height: 568) | |
case .iPhone4: | |
return .init(width: 320, height: 480) | |
// iPads: | |
case .iPadAir: | |
return .init(width: 768, height: 1024) | |
case .iPadPro10AndHalfInch: | |
return .init(width: 834, height: 1112) | |
case .iPadPro11Inch: | |
return .init(width: 834, height: 1194) | |
case .iPadPro12Point9Inch: | |
return .init(width: 1024, height: 1366) | |
} | |
} | |
} | |
// Probable iPhone/iPad model acording to size. Because we want to make different screen designs | |
// according to device sizes, it is more than appropriate to finaly differ the screen resolutions. | |
var sizeModel: DeviceSize { | |
guard let size = DeviceSize.allCases.first(where: { $0.size == UIScreen.main.bounds.size }) else { | |
fatalError("Size detected from this enum was not found. Either some 👽 device or the device is new and was not added.") | |
} | |
return size | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment