iOS получает физический размер экрана программно?

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

11 ответов


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

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


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

вот код, чтобы получить размер экрана:

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

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


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

#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
    }
} 

возможно, Вам понадобится использовать [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;

возможно, код Джеффа Хэя можно адаптировать для включения 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

"формула", которую я использую, -

#define IS_iPhone5 ( fabs( (double)[ [ UIScreen mainScreen ] bounds ].size.height - (double)568 ) < DBL_EPSILON )

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

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


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


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


существует структура, которая расширяет UIDevice для обеспечения некоторого физического имени DeviceGod.

вы можете использовать его через Карфаген.


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);

  • масштаб является persent!