iOS получить физический размер экрана программно? - PullRequest
34 голосов
/ 24 ноября 2011

Возможно ли это?Я хочу количество дюймов, а не количество пикселей.Я знаю, что это примерно 160 ppi.Но не совсем.

Ответы [ 10 ]

53 голосов
/ 24 ноября 2011

Нет API, который даст вам это. Лучше всего посмотреть на размер экрана устройства (в пунктах) и на этом основании предположить, что это iPad или iPhone и т. Д., А затем использовать жестко заданные значения для размеров экрана.

Вот код для получения размера экрана:

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;

Помните, что ширина и высота могут меняться в зависимости от ориентации устройства.

9 голосов
/ 24 ноября 2011

Если бы он был доступен, он был бы в UIScreen или UIDevice , но его там нет.

Вы можете сделать вывод из информации в Расширение UIDevice Эрики и спецификации для каждого устройства, перечисленные здесь, в Википедии .

4 голосов
/ 11 октября 2012

Вот краткий метод оценки размера экрана устройства.Он обновляется для последних устройств, но может не работать на будущих (как и все методы угадывания).Это также может привести к путанице, если устройство зеркально отображается (возвращает размер экрана устройства, а не размер зеркального экрана)

#define SCREEN_SIZE_IPHONE_CLASSIC 3.5
#define SCREEN_SIZE_IPHONE_TALL 4.0
#define SCREEN_SIZE_IPAD_CLASSIC 9.7

+ (CGFloat)screenPhysicalSize
{
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        if (result.height < 500)
            return SCREEN_SIZE_IPHONE_CLASSIC;  // iPhone 4S / 4th Gen iPod Touch or earlier
        else
            return SCREEN_SIZE_IPHONE_TALL;  // iPhone 5
    }
    else
    {
        return SCREEN_SIZE_IPAD_CLASSIC; // iPad
    }
} 
3 голосов
/ 07 ноября 2014

Возможно, вам понадобится [UIScreen mainScreen].scale;

CGFloat scale = [UIScreen mainScreen].scale;
CGRect screenRect = [[UIScreen mainScreen] bounds];

CGFloat physicalWidth = screenRect.size.width * scale;
CGFloat physicalHeight = screenRect.size.height * scale;
0 голосов
/ 18 июля 2017

Никто не сказал о fixedCoordinateSpace.В Swift 3, чтобы получить размеры экрана в портретной ориентации, вы должны использовать: UIScreen.main.fixedCoordinateSpace.bounds

0 голосов
/ 16 февраля 2016

CGFloat scale = [UIScreen mainScreen].scale; CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenWidth = screenRect.size.width * (scale/100.0f); CGFloat screenHeight = screenRect.size.height * (scale/100.0f);

  • шкала присутствует!
0 голосов
/ 24 ноября 2015

Вот быстрый способ получить размеры экрана:

var screenWidth: CGFloat {
    if UIInterfaceOrientationIsPortrait(screenOrientation) {
        return UIScreen.mainScreen().bounds.size.width
    } else {
        return UIScreen.mainScreen().bounds.size.height
    }
}
var screenHeight: CGFloat {
    if UIInterfaceOrientationIsPortrait(screenOrientation) {
        return UIScreen.mainScreen().bounds.size.height
    } else {
        return UIScreen.mainScreen().bounds.size.width
    }
}
var screenOrientation: UIInterfaceOrientation {
    return UIApplication.sharedApplication().statusBarOrientation
}

Они включены в качестве стандартной функции в:

https://github.com/goktugyil/EZSwiftExtensions

0 голосов
/ 13 июня 2014

Я использую "формулу"

#define IS_iPhone5 ( fabs( (double)[ [ UIScreen mainScreen ] bounds ].size.height - (double)568 ) < DBL_EPSILON )
0 голосов
/ 14 июля 2013

Может быть, код Джеффа Хея можно адаптировать для включения iPad Mini. Хитрость заключается в том, чтобы получить идентификатор модели устройства. Самым последним iPad без сетчатки является «iPad2,4», а первым iPad mini - «iPad2,5». Теперь все, что вам нужно проверить, это если масштаб экрана 1,0 (без сетчатки)

Хотя этот код не предназначен для будущего, вы всегда можете добавить дополнительные правила для идентификаторов моделей.

#import <sys/utsname.h>

#define SCREEN_SIZE_IPAD_MINI 7.9

    struct utsname systemInfo;
    uname(&systemInfo);
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && strcasecmp(systemInfo.machine, "iPad2,5") >= 0 [[UIScreen mainScreen] scale] == 1.0)
        return SCREEN_SIZE_IPAD_MINI
0 голосов
/ 24 ноября 2011

Поскольку этот вопрос был задан, я создал библиотеку с открытым исходным кодом для решения этой проблемы: IRLSize . Его можно использовать в любом направлении: для измерения размера представления (или целого экрана) в реальных измерениях или для установки размера представления для конкретного измерения реального мира.

...