Как обнаружить iPhone 5 (широкоэкранные устройства)?
Я только что обновился до XCode 4.5 GM и узнал, что теперь вы можете применить размер "4 Retina" к вашему контроллеру вида в раскадровке.
Теперь, если я хочу создать приложение, которое работает как на iPhone 4, так и на 5, конечно, мне нужно каждый раз создавать каждое окно, но я также должен определить, имеет ли пользователь iPhone с 3,5 "или 4" экраном и затем примените представление.
Как мне это сделать?
Ответы
Ответ 1
Прежде всего, вы не должны перестраивать все свои представления, чтобы они соответствовали новому экрану, и не использовали разные виды для разных размеров экрана.
Используйте возможности iOS с автоматическим изменением размера, поэтому ваши представления могут настраивать и изменять любой размер экрана.
Это не очень сложно, прочитайте некоторую документацию об этом. Это сэкономит вам много времени.
iOS 6 также предлагает новые функции об этом, но на данный момент он все еще находится под управлением NDA.
Обязательно прочитайте API-журнал изменений на веб-сайте Apple Developer, если вы можете получить к нему доступ.
Изменить. Поскольку iOS 6 теперь отсутствует, проверьте новые возможности AutoLayout.
Тем не менее, если вам действительно нужно обнаружить iPhone 5, вы можете просто полагаться на размер .
[ [ UIScreen mainScreen ] bounds ].size.height
Экран iPhone 5 имеет высоту 568.
Вы можете представить макрос, чтобы упростить все это:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Использование fabs
с epsilon здесь для предотвращения ошибок точности при сравнении плавающих точек, как указано в комментариях H2CO3.
Итак, теперь вы можете использовать его в стандартных операторах if/else:
if( IS_IPHONE_5 )
{}
else
{}
Изменить - лучшее обнаружение
Как заявляют некоторые люди, это делает обнаружение широкоэкранного, а не реального iPhone 5.
В следующих версиях iPod touch также может быть такой экран, поэтому мы можем использовать другой набор макросов.
Переименуйте исходный макрос IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
И добавьте макросы обнаружения модели:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
Таким образом, мы можем гарантировать, что у нас есть модель iPhone И, и мы можем переопределить макрос IS_IPHONE_5
:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Также обратите внимание, что, как указано в @LearnCocos2D, эти макросы не будут работать, если приложение не оптимизировано для экрана iPhone 5 (отсутствует изображение [email protected]), так как размер экрана по-прежнему будет 320x480 в таком случае.
Я не думаю, что это может быть проблемой, поскольку я не понимаю, почему мы хотели бы обнаружить iPhone 5 в не оптимизированном приложении.
ВАЖНО - поддержка iOS 8
В iOS 8 свойство bounds
класса UIScreen
теперь отражает ориентацию устройства .
Очевидно, что предыдущий код не будет работать из коробки.
Чтобы исправить это, вы можете просто использовать новое свойство nativeBounds
вместо bounds
, так как оно не изменится с ориентацией и, поскольку оно основано на режиме портретной печати.
Обратите внимание, что размеры nativeBounds
измеряются в пикселях, поэтому для iPhone 5 высота будет 1136 вместо 568.
Если вы также настроите iOS 7 или ниже, обязательно используйте обнаружение функции, так как вызов nativeBounds
до того, как iOS 8 приведет к сбою вашего приложения:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
Вы можете адаптировать предыдущие макросы следующим образом:
#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
#define IS_WIDESCREEN ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )
И, очевидно, если вам нужно определить iPhone 6 или 6 Plus, используйте соответствующие размеры экрана.
Заключительная записка
Комментарии и предложения были включены в этот пост.
Спасибо всем.
Ответ 2
Протестировано и разработано для любой комбинации SDK и ОС:
Swift
Добавлены типы iPad. iPad 2 и iPad mini - это не-сетчатки iPads. В то время как iPad Mini 2 и выше, iPad 3, 4, iPad Air, Air 2, Air 3 и iPad Pro 9.7 имеют одинаковое логическое разрешение 1024. iPad Pro имеет максимальную длину 1366. Ссылка
import UIKit
public enum DisplayType {
case unknown
case iphone4
case iphone5
case iphone6
case iphone6plus
case iPadNonRetina
case iPad
case iPadProBig
static let iphone7 = iphone6
static let iphone7plus = iphone6plus
}
public final class Display {
class var width:CGFloat { return UIScreen.main.bounds.size.width }
class var height:CGFloat { return UIScreen.main.bounds.size.height }
class var maxLength:CGFloat { return max(width, height) }
class var minLength:CGFloat { return min(width, height) }
class var zoomed:Bool { return UIScreen.main.nativeScale >= UIScreen.main.scale }
class var retina:Bool { return UIScreen.main.scale >= 2.0 }
class var phone:Bool { return UIDevice.current.userInterfaceIdiom == .phone }
class var pad:Bool { return UIDevice.current.userInterfaceIdiom == .pad }
class var carplay:Bool { return UIDevice.current.userInterfaceIdiom == .carPlay }
class var tv:Bool { return UIDevice.current.userInterfaceIdiom == .tv }
class var typeIsLike:DisplayType {
if phone && maxLength < 568 {
return .iphone4
}
else if phone && maxLength == 568 {
return .iphone5
}
else if phone && maxLength == 667 {
return .iphone6
}
else if phone && maxLength == 736 {
return .iphone6plus
}
else if pad && !retina {
return .iPadNonRetina
}
else if pad && retina && maxLength == 1024 {
return .iPad
}
else if pad && maxLength == 1366 {
return .iPadProBig
}
return .unknown
}
}
Смотрите в действии
https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346
Примечание: если, например, iPhone 6 находится в увеличенном режиме, UI - увеличенная версия iPhone 5. Эти функции не определяют тип устройства, но режим отображения, поэтому iPhone 5 является желаемым результатом в этом примере.
Objective-C
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_ZOOMED (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
Использование: http://pastie.org/9687735
Примечание: если, например, iPhone 6 находится в увеличенном режиме, пользовательский интерфейс представляет собой увеличенную версию iPhone 5. Эти функции не определяют тип устройства, но режим отображения, поэтому iPhone 5 является желаемым результатом в этом примере.
Ответ 3
Действительно простое решение
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
CGSize result = [[UIScreen mainScreen] bounds].size;
if(result.height == 480)
{
// iPhone Classic
}
if(result.height == 568)
{
// iPhone 5
}
}
Ответ 4
Теперь нам нужно учитывать размеры экрана iPhone 6 и 6Plus. Здесь обновленный ответ
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
//its iPhone. Find out which one?
CGSize result = [[UIScreen mainScreen] bounds].size;
if(result.height == 480)
{
// iPhone Classic
}
else if(result.height == 568)
{
// iPhone 5
}
else if(result.height == 667)
{
// iPhone 6
}
else if(result.height == 736)
{
// iPhone 6 Plus
}
}
else
{
//its iPad
}
Некоторая полезная информация
iPhone 6 Plus 736x414 points 2208x1242 pixels 3x scale 1920x1080 physical pixels 401 physical ppi 5.5"
iPhone 6 667x375 points 1334x750 pixels 2x scale 1334x750 physical pixels 326 physical ppi 4.7"
iPhone 5 568x320 points 1136x640 pixels 2x scale 1136x640 physical pixels 326 physical ppi 4.0"
iPhone 4 480x320 points 960x640 pixels 2x scale 960x640 physical pixels 326 physical ppi 3.5"
iPhone 3GS 480x320 points 480x320 pixels 1x scale 480x320 physical pixels 163 physical ppi 3.5"
Ответ 5
Я взял на себя смелость поместить макрос Macmade в функцию C и назвать его должным образом, потому что он обнаруживает широкоэкранную доступность и НЕ обязательно iPhone 5.
Макрос также не обнаруживает запуск на iPhone 5, если проект не включает [email protected]. Без нового изображения по умолчанию iPhone 5 сообщит о стандартном размере экрана 480x320 (в точках). Таким образом, проверка не только для широкоэкранной доступности, но и для широкоэкранного режима.
BOOL isWidescreenEnabled()
{
return (BOOL)(fabs((double)[UIScreen mainScreen].bounds.size.height -
(double)568) < DBL_EPSILON);
}
Ответ 6
Вот наши коды, тест прошел на ios7/ios8 для iphone4, iphone5, ipad, iphone6, iphone6p, независимо от устройств или симулятора:
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) // iPhone and iPod touch style UI
#define IS_IPHONE_5_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
#define IS_IPHONE_6_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0f)
#define IS_IPHONE_6P_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0f)
#define IS_IPHONE_4_AND_OLDER_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height < 568.0f)
#define IS_IPHONE_5_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 568.0f)
#define IS_IPHONE_6_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 667.0f)
#define IS_IPHONE_6P_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 736.0f)
#define IS_IPHONE_4_AND_OLDER_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) < 568.0f)
#define IS_IPHONE_5 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_5_IOS8 : IS_IPHONE_5_IOS7 )
#define IS_IPHONE_6 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6_IOS8 : IS_IPHONE_6_IOS7 )
#define IS_IPHONE_6P ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6P_IOS8 : IS_IPHONE_6P_IOS7 )
#define IS_IPHONE_4_AND_OLDER ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_4_AND_OLDER_IOS8 : IS_IPHONE_4_AND_OLDER_IOS7 )
Ответ 7
Я использовал hfossli ответ и перевел его в Swift
let IS_IPAD = UIDevice.currentDevice().userInterfaceIdiom == .Pad
let IS_IPHONE = UIDevice.currentDevice().userInterfaceIdiom == .Phone
let IS_RETINA = UIScreen.mainScreen().scale >= 2.0
let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height
let SCREEN_MAX_LENGTH = max(SCREEN_WIDTH, SCREEN_HEIGHT)
let SCREEN_MIN_LENGTH = min(SCREEN_WIDTH, SCREEN_HEIGHT)
let IS_IPHONE_4_OR_LESS = (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
let IS_IPHONE_5 = (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
let IS_IPHONE_6 = (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
let IS_IPHONE_6P = (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
Ответ 8
Это макрос для моего проекта cocos2d. должны быть одинаковыми для других приложений.
#define WIDTH_IPAD 1024
#define WIDTH_IPHONE_5 568
#define WIDTH_IPHONE_4 480
#define HEIGHT_IPAD 768
#define HEIGHT_IPHONE 320
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
//width is height!
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_5 )
#define IS_IPHONE_4 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_4 )
#define cp_ph4(__X__, __Y__) ccp(cx_ph4(__X__), cy_ph4(__Y__))
#define cx_ph4(__X__) (IS_IPAD ? (__X__ * WIDTH_IPAD / WIDTH_IPHONE_4) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPHONE_4) : (__X__)))
#define cy_ph4(__Y__) (IS_IPAD ? (__Y__ * HEIGHT_IPAD / HEIGHT_IPHONE) : (__Y__))
#define cp_pad(__X__, __Y__) ccp(cx_pad(__X__), cy_pad(__Y__))
#define cx_pad(__X__) (IS_IPAD ? (__X__) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPAD) : (__X__ * WIDTH_IPHONE_4 / WIDTH_IPAD)))
#define cy_pad(__Y__) (IS_IPAD ? (__Y__) : (__Y__ * HEIGHT_IPHONE / HEIGHT_IPAD))
Ответ 9
if ((int)[[UIScreen mainScreen] bounds].size.height == 568)
{
// This is iPhone 5 screen
} else {
// This is iPhone 4 screen
}
Ответ 10
В проекте Swift, iOS 8+ мне нравится делать расширение на UIScreen
, например:
extension UIScreen {
var isPhone4: Bool {
return self.nativeBounds.size.height == 960;
}
var isPhone5: Bool {
return self.nativeBounds.size.height == 1136;
}
var isPhone6: Bool {
return self.nativeBounds.size.height == 1334;
}
var isPhone6Plus: Bool {
return self.nativeBounds.size.height == 2208;
}
}
(ПРИМЕЧАНИЕ: nativeBounds
находится в пикселях).
И тогда код будет выглядеть следующим образом:
if UIScreen.mainScreen().isPhone4 {
// do smth on the smallest screen
}
Таким образом, код дает понять, что это проверка для основного экрана, а не для модели устройства.
Ответ 11
Заимствование от Samrat Mazumdar ответьте, здесь короткий метод, который оценивает размер экрана устройства. Он работает с последними устройствами, но может не работать в будущем (как и все методы угадывания). Он также путается, если устройство зеркалируется (возвращает размер экрана устройства, а не зеркальный размер экрана)
#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
}
}
Ответ 12
Я думаю, что должно быть хорошо, если этот макрос будет работать в устройстве и симуляторе, ниже это решение.
#define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)
#define IS_IPHONE (([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"]) || ([[[UIDevice currentDevice] model] isEqualToString: @"iPhone Simulator"]))
#define IS_IPOD ([[[UIDevice currentDevice]model] isEqualToString:@"iPod touch"])
#define IS_IPHONE_5 ((IS_IPHONE || IS_IPOD) && IS_WIDESCREEN)
Ответ 13
Я обнаружил, что ответы не содержат специального случая для симуляторов.
#define IS_WIDESCREEN ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
#define IS_IPHONE ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPhone"].location != NSNotFound)
#define IS_IPAD ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPad"].location != NSNotFound)
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Ответ 14
+(BOOL)isDeviceiPhone5
{
BOOL iPhone5 = FALSE;
CGRect screenBounds = [[UIScreen mainScreen] bounds];
if (screenBounds.size.height == 568)
{
// code for 4-inch screen
iPhone5 = TRUE;
}
else
{
iPhone5 = FALSE;
// code for 3.5-inch screen
}
return iPhone5;
}
Ответ 15
CGFloat height = [UIScreen mainScreen].bounds.size.height;
NSLog(@"screen soze is %f",height);
if (height>550) {
// 4" screen-do some thing
}
else if (height<500) {
// 3.5 " screen- do some thing
}
Ответ 16
Опора в размере неверна на многих уровнях. Как насчет того, чтобы мы просили систему?
- (NSString *) getDeviceModel
{
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}
Взято из Лучший способ определить тип аппаратного обеспечения, iPhone4 или iPhone5?, ответ edzio27.
Ответ 17
Таким образом вы можете обнаружить семейство устройств.
#import <sys/utsname.h>
NSString* deviceName()
{
struct utsname systemInformation;
uname(&systemInformation);
NSString *result = [NSString stringWithCString:systemInformation.machine
encoding:NSUTF8StringEncoding];
return result;
}
#define isIPhone5 [deviceName() rangeOfString:@"iPhone5,"].location != NSNotFound
#define isIPhone5S [deviceName() rangeOfString:@"iPhone6,"].location != NSNotFound
Ответ 18
Если проект создан с использованием Xcode 6, используйте нижеприведенный код для обнаружения устройств.
printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height);
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){
printf("Device Type : iPhone 4,4s ");
}else if([[UIScreen mainScreen] nativeBounds].size.height == 1136){
printf("Device Type : iPhone 5,5S/iPod 5 ");
}else if([[UIScreen mainScreen] nativeBounds].size.height == 1334){
printf("Device Type : iPhone 6 ");
}else if([[UIScreen mainScreen] nativeBounds].size.height == 2208){
printf("Device Type : iPhone 6+ ");
}
}
}else{
printf("Device Type : iPad");
}
Если проект был создан в Xcode 5 и открыт в Xcode 6, используйте нижеприведенный код для обнаружения устройств. (Этот код работает, если не назначены стартовые изображения для iPhone 6,6+)
printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height);
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){
printf("Device Type : iPhone 4,4s");
appType=1;
}else if([[UIScreen mainScreen] nativeBounds].size.height == 1136 || [[UIScreen mainScreen] nativeBounds].size.height == 1704){
printf("Device Type : iPhone 5,5S,6,6S/iPod 5 ");
appType=3;
}
}
}else{
printf("Device Type : iPad");
appType=2;
}
Если вы все еще используете Xcode 5 вместе, используйте следующий код для обнаружения устройств (iPhone 6 и 6+ не будут обнаружены)
printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] bounds].size.width,(int)[[UIScreen mainScreen] bounds].size.height);
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);
if(result.height == 960 || result.height == 480){
printf("Device Type : iPhone 4,4S ");
}else if(result.height == 1136){
printf("Device Type : iPhone 5s/iPod 5");
}
}
}else{
printf("Device Type : iPad");
}
Ответ 19
-
Добавить "Новый быстрый файл" → AppDelegateEx.swift
-
добавьте расширение AppDelegate
import UIKit
extension AppDelegate {
class func isIPhone5 () -> Bool{
return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 568.0
}
class func isIPhone6 () -> Bool {
return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 667.0
}
class func isIPhone6Plus () -> Bool {
return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 736.0
}
}
-
Использование:
if AppDelegate.isIPhone5() {
collectionViewTopConstraint.constant = 2
}else if AppDelegate.isIPhone6() {
collectionViewTopConstraint.constant = 20
}
Ответ 20
На это ответили сто раз, но это решение работало лучше всего для меня. Это простая вспомогательная функция и не требует расширения системного класса.
Свифт 3 Помощник:
func phoneSizeInInches(defaultValue: Float = 4.7) -> Float {
switch (UIScreen.main.nativeBounds.size.height) {
case 960, 480:
return 3.5
case 1136:
return 4
case 1334:
return 4.7
case 2208:
return 5.5
default:
return defaultValue
}
}
Это связано с тем, что легко запоминать размеры телефона в дюймах, например, "5,5-дюймовый" или "4,7-дюймовый", но трудно запоминать точные размеры пикселей.
if phoneSizeInInches() == 4 {
//do something with only 4 inch iPhones
}
Это также дает вам возможность сделать что-то вроде этого:
if phoneSizeInInches() < 5.5 {
//do something all iPhones smaller than the plus
}
"defaultValue" гарантирует, что ваш код всегда будет защищен до безопасного размера, если Apple выпустит новый размер устройства, и вы еще не обновили приложение.
if phoneSizeInInches(defaultValue: 4.7) == 4 {
//if a new iPhone size is introduced, your code will default to behaving like a 4.7 inch iPhone
}
Обратите внимание, что это специфично для телефонных приложений, для некоторых универсальных изменений потребуются некоторые изменения.
Ответ 21
В Swift 3 вы можете использовать мой простой класс KRDeviceType.
https://github.com/ulian-onua/KRDeviceType
Он хорошо документирован и поддерживает операторы ==, > =, < =.
Например, чтобы определить, имеет ли устройство ограничения iPhone 6/6s/7, вы можете просто использовать следующее сравнение:
if KRDeviceType() == .iPhone6 {
// Perform appropiate operations
}
Чтобы определить, имеет ли устройство ограничения iPhone 5/5S/SE или ранее (iPhone 4s), вы можете использовать следующее сравнение:
if KRDeviceType() <= .iPhone5 { //iPhone 5/5s/SE of iPhone 4s
// Perform appropiate operations (for example, set up constraints for those old devices)
}
Ответ 22
используйте следующий код:
CGFloat screenScale = [[UIScreen mainScreen] scale];
CGRect screenBounds = [[UIScreen mainScreen] bounds];
CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale);
if (screenSize.height==1136.000000)
{
// Here iPhone 5 View
// Eg: Nextview~iPhone5.Xib
} else {
// Previous Phones
// Eg : Nextview.xib
}
Ответ 23
Вот правильный тест устройства, не зависящий от ориентации
- (BOOL)isIPhone5
{
CGSize size = [[UIScreen mainScreen] bounds].size;
if (MIN(size.width,size.height) == 320 && MAX(size.width,size.height == 568)) {
return YES;
}
return NO;
}
Ответ 24
Используется для обнаружения устройств iPhone и iPad всех версий.
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)