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
}
они включены в качестве стандартной функции в:
поскольку этот вопрос был задан, я создал библиотеку с открытым исходным для решения этой проблемы: 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!