how to check screen size of iphone 4 and iphone 5 programmatically in swift
Objective CSwiftObjective C Problem Overview
I need to replace this Objective-C to Swift. Does anyone have any suggestions on how to transfer it?
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
CGSize result = [[UIScreen mainScreen] bounds].size;
if(result.height == 480)
{
// iPhone Classic
}
if(result.height == 568)
{
// iPhone 5
}
}
Objective C Solutions
Solution 1 - Objective C
Xcode 12.4 • Swift 5.3 or later
extension UIDevice {
var iPhoneX: Bool { UIScreen.main.nativeBounds.height == 2436 }
var iPhone: Bool { UIDevice.current.userInterfaceIdiom == .phone }
var iPad: Bool { UIDevice().userInterfaceIdiom == .pad }
enum ScreenType: String {
case iPhones_4_4S = "iPhone 4 or iPhone 4S"
case iPhones_5_5s_5c_SE = "iPhone 5, iPhone 5s, iPhone 5c or iPhone SE"
case iPhones_6_6s_7_8 = "iPhone 6, iPhone 6S, iPhone 7 or iPhone 8"
case iPhones_6Plus_6sPlus_7Plus_8Plus = "iPhone 6 Plus, iPhone 6S Plus, iPhone 7 Plus or iPhone 8 Plus"
case iPhones_6Plus_6sPlus_7Plus_8Plus_Simulators = "iPhone 6 Plus, iPhone 6S Plus, iPhone 7 Plus or iPhone 8 Plus Simulators"
case iPhones_X_XS_12MiniSimulator = "iPhone X or iPhone XS or iPhone 12 Mini Simulator"
case iPhone_XR_11 = "iPhone XR or iPhone 11"
case iPhone_XSMax_ProMax = "iPhone XS Max or iPhone Pro Max"
case iPhone_11Pro = "iPhone 11 Pro"
case iPhone_12Mini = "iPhone 12 Mini"
case iPhone_12_12Pro = "iPhone 12 or iPhone 12 Pro"
case iPhone_12ProMax = "iPhone 12 Pro Max"
case unknown
}
var screenType: ScreenType {
switch UIScreen.main.nativeBounds.height {
case 1136: return .iPhones_5_5s_5c_SE
case 1334: return .iPhones_6_6s_7_8
case 1792: return .iPhone_XR_11
case 1920: return .iPhones_6Plus_6sPlus_7Plus_8Plus
case 2208: return .iPhones_6Plus_6sPlus_7Plus_8Plus_Simulators
case 2340: return .iPhone_12Mini
case 2426: return .iPhone_11Pro
case 2436: return .iPhones_X_XS_12MiniSimulator
case 2532: return .iPhone_12_12Pro
case 2688: return .iPhone_XSMax_ProMax
case 2778: return .iPhone_12ProMax
default: return .unknown
}
}
}
print("screenType:", UIDevice.current.screenType)
Solution 2 - Objective C
Alternative solution with UIScreen extension ( iOS 8 and later):
extension UIScreen {
enum SizeType: CGFloat {
case Unknown = 0.0
case iPhone4 = 960.0
case iPhone5 = 1136.0
case iPhone6 = 1334.0
case iPhone6Plus = 1920.0
}
var sizeType: SizeType {
let height = nativeBounds.height
guard let sizeType = SizeType(rawValue: height) else { return .Unknown }
return sizeType
}
}
Usage:
if UIScreen.mainScreen().sizeType == .iPhone4 {
// Make specific layout for small devices.
}
Solution 3 - Objective C
if UIDevice().userInterfaceIdiom == .Phone {
switch UIScreen.mainScreen().bounds.size.height{
case 480:
print("iPhone 4S")
case 568:
print("iPhone 5")
default:
print("other models")
}
}
UIScreen.mainScreen().bounds.size.height will provide the height of the device. By using this value we can check the particular iphone device.
Solution 4 - Objective C
New Update with iPhone XS, iPhone XS Max & iPhone XR
extension UIDevice {
var iPhoneX: Bool {
return UIScreen.main.nativeBounds.height == 2436
}
var iPhone: Bool {
return UIDevice.current.userInterfaceIdiom == .phone
}
enum ScreenType: String {
case iPhone4_4S = "iPhone 4 or iPhone 4S"
case iPhones_5_5s_5c_SE = "iPhone 5, iPhone 5s, iPhone 5c or iPhone SE"
case iPhones_6_6s_7_8 = "iPhone 6, iPhone 6S, iPhone 7 or iPhone 8"
case iPhones_6Plus_6sPlus_7Plus_8Plus = "iPhone 6 Plus, iPhone 6S Plus, iPhone 7 Plus or iPhone 8 Plus"
case iPhoneXR = "iPhone XR"
case iPhoneX_iPhoneXS = "iPhone X,iPhoneXS"
case iPhoneXSMax = "iPhoneXS Max"
case unknown
}
var screenType: ScreenType {
switch UIScreen.main.nativeBounds.height {
case 960:
return .iPhone4_4S
case 1136:
return .iPhones_5_5s_5c_SE
case 1334:
return .iPhones_6_6s_7_8
case 1792:
return .iPhoneXR
case 1920, 2208:
return .iPhones_6Plus_6sPlus_7Plus_8Plus
case 2436:
return .iPhoneX_iPhoneXS
case 2688:
return .iPhoneXSMax
default:
return .unknown
}
}
}
print("screenType:", UIDevice.current.screenType.rawValue)
Solution 5 - Objective C
Here's how I do it with Xcode 10 + Swift 4 + iPhone XS/XS Max/XR
struct ScreenSize {
static let SCREEN_WIDTH = UIScreen.main.bounds.size.width
static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}
struct DeviceType {
static let IS_IPHONE_4_OR_LESS = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
static let IS_IPHONE_6 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
static let IS_IPHONE_6P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
static let IS_IPHONE_X = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812
static let IS_IPAD = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0
static let IS_IPAD_PRO = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0
static let IS_IPHONE_XSMAX = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 2688
static let IS_IPHONE_XR = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 1792
}
Solution 6 - Objective C
Just to add to https://stackoverflow.com/a/27776671/1766242
Allows you to write
if UIDevice.isScreen35inch() {
// Do something to fit small screen
} else {
// do something else for larger screens
}
See below
extension UIDevice {
var iPhone: Bool {
return UIDevice().userInterfaceIdiom == .Phone
}
enum ScreenType: String {
case iPhone4
case iPhone5
case iPhone6
case iPhone6Plus
case Unknown
}
var screenType: ScreenType? {
guard iPhone else { return nil }
switch UIScreen.mainScreen().nativeBounds.height {
case 960:
return .iPhone4
case 1136:
return .iPhone5
case 1334:
return .iPhone6
case 2208:
return .iPhone6Plus
default:
return nil
}
}
// helper funcs
static func isScreen35inch() -> Bool {
return UIDevice().screenType == .iPhone4
}
func isScreen4inch() -> Bool {
return UIDevice().screenType == .iPhone5
}
func isScreen47inch() -> Bool {
return UIDevice().screenType == .iPhone6
}
func isScreen55inch() -> Bool {
return UIDevice().screenType == .iPhone6Plus
}}
Solution 7 - Objective C
Xcode 11 and Swift 4.2
If you want a set frame using the screen type. Its work fine to me
enum ScreenType: String {
case iPhones_4_4S = "iPhone 4 or iPhone 4S"
case iPhones_5_5s_5c_SE = "iPhone 5, iPhone 5s, iPhone 5c or iPhone SE"
case iPhones_6_6s_7_8 = "iPhone 6, iPhone 6S, iPhone 7 or iPhone 8"
case iPhones_6Plus_6sPlus_7Plus_8Plus = "iPhone 6 Plus, iPhone 6S Plus, iPhone 7 Plus or iPhone 8 Plus"
case iPhones_X_XS = "iPhone X or iPhone XS"
case iPhone_XR = "iPhone XR"
case iPhone_XSMax = "iPhone XS Max"
case unknown
}
var screenType: ScreenType {
switch UIScreen.main.nativeBounds.height {
case 960:
return .iPhones_4_4S
case 1136:
return .iPhones_5_5s_5c_SE
case 1334:
return .iPhones_6_6s_7_8
case 1792:
return .iPhone_XR
case 1920, 2208:
return .iPhones_6Plus_6sPlus_7Plus_8Plus
case 2436:
return .iPhones_X_XS
case 2688:
return .iPhone_XSMax
default:
return .unknown
}
}
override func viewWillLayoutSubviews() {
if screenType == .iPhone_XR || screenType == .iPhones_X_XS || screenType == .iPhone_XSMax {
self.contentView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - 95)
} else {
self.contentView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - 64)
}
}
Solution 8 - Objective C
In addition to the proposed way, One way of doing this is to use the struct in following way.
struct ScreenSize
{
static let SCREEN_WIDTH = UIScreen.main.bounds.size.width
static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}
struct DeviceType
{
static let IS_IPHONE_4_OR_LESS = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
static let IS_IPHONE_6 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
static let IS_IPHONE_6P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
static let IS_IPAD = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0
static let IS_IPAD_PRO = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0
}
Let me know if it helps.
Solution 9 - Objective C
try to use this:
Create a UIViewController+Extension.swift file: and put into below code:
enum DeviceTypeModel{
case iphoneX
case iphone8Plus
case iphone8
case iphoneSE //SE is the like iphone 5 and iphone 5s
case iphone4s
}
extension UIViewController{
func runOnTheDeviceType(_ completion: (DeviceTypeModel) -> Void) {
if UIDevice().userInterfaceIdiom == .phone{
switch UIScreen.main.nativeBounds.height{
case 2436:
completion(.iphoneX)
case 1920:
completion(.iphone8Plus)
case 1334:
completion(.iphone8)
case 1136:
completion(.iphoneSE)
default:
completion(.iphone4s)
}
}
}
}
and use it in your viewController.swift like this:
class ChatViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
runOnTheDeviceType { devices in
switch devices{
case .iphoneSE:
//do something
case .iphone4s:
//do something
default:
//do something
}
}
}
}
you can add more cases if you want to do it. Enjoy it.
Solution 10 - Objective C
Answer by Leo fixed it for me. Here is some sample class for all the Xamarin.IOS devs :)
public static class ScreenHelper
{
public enum ScreenSizeType
{
iPhone4_4s,
iPhone5_5s_5c_SE,
iPhone6_6s_7_8,
iPhone6plus_6sPlus_7Plus_8Plus,
iPhoneX,
unknown
}
public static bool IsIphone
{
get
{
return UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone;
}
}
public static bool IsNarrowScreen
{
get
{
return UIScreen.MainScreen.NativeBounds.Width <= 640;
}
}
public static ScreenSizeType CurrentScreenType
{
get
{
switch ((int)UIScreen.MainScreen.NativeBounds.Height)
{
case 960:
return ScreenSizeType.iPhone4_4s;
case 1136:
return ScreenSizeType.iPhone5_5s_5c_SE;
case 1334:
return ScreenSizeType.iPhone6_6s_7_8;
case 1920:
case 2208:
return ScreenSizeType.iPhone6plus_6sPlus_7Plus_8Plus;
case 2436:
return ScreenSizeType.iPhoneX;
default:
return ScreenSizeType.unknown;
}
}
}
}
Solution 11 - Objective C
Quick Update based on Leo's answer for the iPhone 12/12 Pro/12 Mini/12 Pro Max
// handle device screen types and sizes
public extension UIDevice {
var iPhoneX: Bool { UIScreen.main.nativeBounds.height == 2436 }
var iPhone: Bool { UIDevice.current.userInterfaceIdiom == .phone }
var iPad: Bool { UIDevice().userInterfaceIdiom == .pad }
enum ScreenType: String {
case iPhones_4_4S = "iPhone 4 or iPhone 4S"
case iPhones_5_5s_5c_SE = "iPhone 5, iPhone 5s, iPhone 5c or iPhone SE"
case iPhones_6_6s_7_8 = "iPhone 6, iPhone 6S, iPhone 7 or iPhone 8"
case iPhones_6Plus_6sPlus_7Plus_8Plus = "iPhone 6 Plus, iPhone 6S Plus, iPhone 7 Plus or iPhone 8 Plus"
case iPhones_X_XS_12mini = "iPhone X or iPhone XS"
case iPhone_XR_11 = "iPhone XR or iPhone 11"
case iPhone_XSMax_ProMax = "iPhone XS Max or iPhone Pro Max"
case iPhone_11Pro = "iPhone 11 Pro"
case iPhone_12_12Pro = "iPhone 12 or 12 Pro"
case iPhone_12ProMax = "iPhone 12 Pro Max"
case unknown
}
var screenType: ScreenType {
guard iPhone else { return .unknown }
switch UIScreen.main.nativeBounds.height {
case 960:
return .iPhones_4_4S
case 1136:
return .iPhones_5_5s_5c_SE
case 1334:
return .iPhones_6_6s_7_8
case 1920, 2208:
return .iPhones_6Plus_6sPlus_7Plus_8Plus
case 2426:
return .iPhone_11Pro
case 2436:
return .iPhones_X_XS_12mini
case 2532:
return .iPhone_12_12Pro
case 2688:
return .iPhone_XSMax_ProMax
case 2778:
return .iPhone_12ProMax
default:
return .unknown
}
}
}
Solution 12 - Objective C
Updated for iPhone 13 Mini, 13, 13 Pro and 13 Pro Max
public extension UIDevice {
var iPhone: Bool { UIDevice.current.userInterfaceIdiom == .phone }
var iPad: Bool { UIDevice().userInterfaceIdiom == .pad }
enum ScreenType: String {
case iPhones_4_4S = "iPhone 4 or iPhone 4S"
case iPhones_5_5s_5c_SE = "iPhone 5, iPhone 5s, iPhone 5c or iPhone SE"
case iPhones_6_6s_7_8 = "iPhone 6, iPhone 6S, iPhone 7 or iPhone 8"
case iPhones_6Plus_6sPlus_7Plus_8Plus = "iPhone 6 Plus, iPhone 6S Plus, iPhone 7 Plus or iPhone 8 Plus"
case iPhones_X_XS_12mini = "iPhone X or iPhone XS"
case iPhone_XR_11 = "iPhone XR or iPhone 11"
case iPhone_XSMax_ProMax = "iPhone XS Max or iPhone Pro Max"
case iPhone_11Pro = "iPhone 11 Pro"
case iPhone_12_12Pro_13_13Pro = "iPhone 12 or 12 Pro or 13 or 13 Pro"
case iPhone_12ProMax_13ProMax = "iPhone 12 Pro Max or 13 Pro Max"
case iPhone_13Mini = "iPhone 13 Mini"
case unknown
}
var screenType: ScreenType {
guard iPhone else { return .unknown }
switch UIScreen.main.nativeBounds.height {
case 960:
return .iPhones_4_4S
case 1136:
return .iPhones_5_5s_5c_SE
case 1334:
return .iPhones_6_6s_7_8
case 1792:
return .iPhone_XR_11
case 1920, 2208:
return .iPhones_6Plus_6sPlus_7Plus_8Plus
case 2340:
return .iPhone_13Mini
case 2426:
return .iPhone_11Pro
case 2436:
return .iPhones_X_XS_12mini
case 2532:
return .iPhone_12_12Pro_13_13Pro
case 2688:
return .iPhone_XSMax_ProMax
case 2778:
return .iPhone_12ProMax_13ProMax
default:
return .unknown
}
}
}
Solution 13 - Objective C
You can also try this below code:
if (IS_IPHONE4) {
imgHeight.constant = 150;
}
else if (IS_IPAD) {
imgHeight.constant = 300;
}
else if (IS_IPHONE5) {
imgHeight.constant = 170;
}
else {
imgHeight.constant = 200;
}
Thanks.