Я только что обновился до XCode 4.5 GM и обнаружил, что теперь вы можете применить размер «4» Retina к вашему контроллеру представления в раскадровке.
Теперь, если я хочу создать приложение, которое работает как на iPhone 4, так и на 5, я, конечно, должен создать каждое окно дважды, но я также должен определить, есть ли у пользователя iPhone с экраном 3,5 или 4 дюйма, и затем применить Посмотреть.
Как мне это сделать?
Ответы:
Прежде всего, вы не должны перестраивать все ваши представления, чтобы соответствовать новому экрану, или использовать разные представления для разных размеров экрана.
Используйте возможности автоматического изменения размера iOS, чтобы ваши представления могли корректироваться и адаптироваться к любому размеру экрана.
Это не очень сложно, почитайте документацию об этом. Это сэкономит вам много времени.
iOS 6 также предлагает новые функции по этому поводу.
Обязательно прочтите журнал изменений API iOS 6 на веб-сайте Apple Developer.
И проверьте новые возможности iOS 6 AutoLayout .
Тем не менее, если вам действительно нужно обнаружить iPhone 5, вы можете просто положиться на размер экрана .
Экран iPhone 5 имеет высоту 568.
Вы можете представить макрос, чтобы упростить все это:
Использование
fabs
с epsilon здесь для предотвращения ошибок точности при сравнении чисел с плавающей запятой, как указано в комментариях H2CO3.Так что теперь вы можете использовать его в стандартных операторах if / else:
Edit - лучшее обнаружение
Как утверждают некоторые люди, это только обнаруживает широкоэкранный , а не реальный iPhone 5.
В следующих версиях iPod touch также может быть такой экран, поэтому мы можем использовать другой набор макросов.
Давайте переименуем оригинальный макрос
IS_WIDESCREEN
:И давайте добавим макросы определения модели:
Таким образом, мы можем убедиться, что у нас есть модель iPhone и широкоформатный экран, и мы можем переопределить
IS_IPHONE_5
макрос:Также обратите внимание, что, как утверждает @ LearnCocos2D, эти макросы не будут работать, если приложение не оптимизировано для экрана iPhone 5 (без изображения Default-568h@2x.png), так как размер экрана в таком случае будет 320x480. случай.
Я не думаю, что это может быть проблемой, так как я не понимаю, почему мы хотели бы обнаружить iPhone 5 в неоптимизированном приложении.
ВАЖНО - поддержка iOS 8
В iOS 8
bounds
свойствоUIScreen
класса теперь отражает ориентацию устройства .Очевидно, что предыдущий код не будет работать из коробки.
Чтобы исправить это, вы можете просто использовать новое
nativeBounds
свойство вместо тогоbounds
, чтобы оно не изменялось в зависимости от ориентации, и поскольку оно основано на портретном режиме.Обратите внимание, что размеры
nativeBounds
измеряются в пикселях, поэтому для iPhone 5 высота будет 1136 вместо 568.Если вы также ориентируетесь на iOS 7 или ниже, обязательно используйте функцию обнаружения функций, поскольку вызов
nativeBounds
до iOS 8 приведет к сбою приложения:Вы можете адаптировать предыдущие макросы следующим образом:
И, очевидно, если вам нужно обнаружить iPhone 6 или 6 Plus, используйте соответствующие размеры экрана.
источник
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
DBL_EPSILON
не является обязательным, и==
сравнение не будет неудачным: необходимо проводить сравнение с использованием различий таким образом, только если значение с плавающей запятой не может быть выражено как точное число (как,1.0/3.0*3.0
например,). Прочитайте эту статью для получения дополнительной информации;)Протестировано и разработано для любой комбинации SDK и ОС:
стриж
Добавлены типы iPad. iPad 2 и iPad mini не являются сетевыми iPad. В то время как iPad Mini 2 и выше, iPad 3, 4, iPad Air, Air 2, Air 3 и iPad Pro 9.7 имеют одинаковое логическое разрешение 1024. У iPad Pro максимальная длина 1366. Ссылка
Посмотреть это в действии https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346
Примечание. Если, например, iPhone 6 находится в режиме увеличения, пользовательский интерфейс является увеличенной версией iPhone 5. Эти функции определяют не тип устройства, а режим отображения, поэтому iPhone 5 является желаемым результатом в этом примере.
Objective-C
Использование: http://pastie.org/9687735
Примечание. Если, например, iPhone 6 находится в режиме увеличения, пользовательский интерфейс является увеличенной версией iPhone 5. Эти функции определяют не тип устройства, а режим отображения, поэтому iPhone 5 является желаемым результатом в этом примере.
источник
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
что поможет определить разницу между iPhone4 и iPhone5 и iPad Retina и non-retinaSCREEN_MAX_LENGTH
чтобы получить 568 во всех поворотах на iPhone 5.Действительно простое решение
источник
Теперь нам нужно учесть размеры экрана iPhone 6 и 6Plus. Вот обновленный ответ
Некоторая полезная информация
источник
Я взял на себя смелость поместить макрос от Macmade в функцию C и правильно назвать его, потому что он обнаруживает широкоэкранную доступность и НЕ обязательно iPhone 5.
Макрос также не обнаруживает запуск на iPhone 5 в случае, если проект не включает Default-568h@2x.png . Без нового изображения по умолчанию iPhone 5 будет отображать обычный размер экрана 480x320 (в пунктах). Таким образом, проверка не только для широкоэкранной доступности, но и для включения широкоэкранного режима .
источник
inline
d. Они также будут указаны там, где оптимизатор компилятора считает, что это хорошая идея, и где он может знать, что это допустимо (например, функция находится в том же модуле). Реализация подобных вещей через функцию может иногда приводить к дополнительной проверке типов.Вот наши коды, тест пройден на ios7 / ios8 для iphone4, iphone5, ipad, iphone6, iphone6p, независимо от устройства или симулятора:
источник
Я использовал ответ Хфоссли и перевел его на Свифт
источник
это макрос для моего проекта cocos2d. должно быть таким же для других приложений.
источник
источник
В проекте Swift, iOS 8+, я хотел бы сделать расширение
UIScreen
, например:(ПРИМЕЧАНИЕ:
nativeBounds
в пикселях).И тогда код будет выглядеть так:
Таким образом, код проясняет, что это проверка для основного экрана, а не для модели устройства.
источник
Исходя из ответа Самрата Мазумдара, вот краткий метод, который оценивает размер экрана устройства. Он работает с последними устройствами, но может не работать на будущих (как и все методы угадывания). Это также может привести к путанице, если устройство зеркально отражается (возвращает размер экрана устройства, а не размер зеркального экрана)
источник
Я думаю, что будет хорошо, если этот макрос будет работать в устройстве и симуляторе, ниже приведены решения.
источник
Я обнаружил, что ответы не включают в себя особый случай для симуляторов.
источник
источник
iPhone5 = FALSE;
неисточник
Полагаться на размер неправильно на многих уровнях. Как насчет того, чтобы спросить систему?
Взято из Лучший способ определить тип оборудования, iPhone4 или iPhone5? , edzio27 ответ.
источник
Таким образом, вы можете обнаружить семейство устройств.
источник
Если проект создан с использованием Xcode 6, используйте указанный ниже код для обнаружения устройств.
Если проект был создан в Xcode 5 и открыт в Xcode 6, используйте указанный ниже код для обнаружения устройств (этот код работает, если не назначены изображения для запуска iPhone 6,6+).
Если вы все еще используете Xcode 5 все вместе, используйте следующий код для обнаружения устройств (iPhone 6 и 6+ не будут обнаружены)
источник
Добавить «Новый файл Swift» ->
AppDelegateEx.swift
добавить расширение к
AppDelegate
использование:
источник
В Swift 3 вы можете использовать мой простой класс KRDeviceType.
https://github.com/ulian-onua/KRDeviceType
Он хорошо документирован и поддерживает операторы ==,> =, <=.
Например, чтобы определить, имеет ли устройство границы iPhone 6 / 6s / 7, вы можете просто использовать следующее сравнение:
Чтобы определить, имеет ли устройство границы iPhone 5 / 5S / SE или более ранних версий (iPhone 4s), вы можете использовать следующее сравнение:
источник
На это уже сто раз отвечали, но это решение работало лучше всего для меня и помогло решить проблему, когда появляются новые устройства, а размер не определен.
Swift 5 Helper:
Это связано с тем, что запоминать размеры телефона, например, «5,5 дюйма» или «4,7 дюйма», легко, но трудно запомнить точные размеры пикселей.
Это также дает вам возможность сделать что-то вроде этого:
По умолчанию: пытается использовать размер экрана и масштаб, чтобы попытаться вычислить диагональные дюймы. Это происходит в случае появления какого-либо нового размера устройства, оно будет стараться определить, и код, такой как последний пример, должен все еще работать.
источник
используйте следующий код:
источник
Вот правильный тест устройства, вне зависимости от ориентации
источник
Используется для обнаружения устройств iPhone и iPad всех версий.
источник
IS_RETINA
на iPhone 6 плюс, выполняется 1x код?@1x
, где должны уступить@3x
. в любом случае: как вы просто копировать и вставлять: -1