Новый дисплей iPhone 5 имеет новое соотношение сторон и новое разрешение (640 x 1136 пикселей).
Что требуется для разработки новых или переноса уже существующих приложений на новый размер экрана?
Что мы должны делать, чтобы сделать приложения "универсальными" как для более старых дисплеев, так и для нового широкоформатного формата?
Ответ 1
- Загрузите и установите последнюю версию Xcode.
- Установите файл экрана запуска для вашего приложения (на общей вкладке ваших целевых настроек). Вот как вы можете использовать полный размер любого экрана, включая размеры разделенного экрана iPad в iOS 9.
- Протестируйте свое приложение и, надеюсь, больше ничего не сделайте, поскольку все должно работать волшебным образом, если вы правильно установили маски автоматического изменения размера или использовали автоматическое расположение.
- Если вы этого не сделали, настройте макеты просмотра, предпочтительно с помощью Auto Layout.
- Если есть что-то, что вам нужно сделать специально для больших экранов, то похоже, что вы должны проверить высоту
[[UIScreen mainScreen] bounds]
как для этого, похоже, нет конкретного API. Начиная с iOS 8 есть также классы размеров, которые абстрагируют размеры экрана в обычный или компактный по вертикали и горизонтали и рекомендуют способ адаптации вашего пользовательского интерфейса.
Ответ 2
Если у вас есть приложение, созданное для iPhone 4S или ранее, оно будет работать на почтовом ящике на iPhone 5.
Чтобы адаптировать приложение к новому более высокому экрану, первое, что вы делаете, - изменить образ запуска на: Default-568h@2x.png. Его размер должен быть 1136x640 (HxW). Да, имея изображение по умолчанию в новом размере экрана, это ключ, позволяющий вашему приложению использовать весь новый экран iPhone 5.
(Обратите внимание, что соглашение об именах работает только для изображения по умолчанию. Именование другого изображения "Image-568h@2x.png" не приведет к его загрузке вместо "Image@2x.png". загружать разные изображения для разных размеров экрана, вам придется делать это программно.)
Если вам очень повезло, возможно, это так... но, по всей вероятности, вам нужно будет сделать еще несколько шагов.
- Убедитесь, что ваши Xibs/Views используют автоматическую компоновку для изменения размера.
- Используйте springs и struts для изменения размеров.
- Если это недостаточно для вашего приложения, спроектируйте xib/раскадровку
для одного конкретного размера экрана и программно
другой.
В крайнем случае (когда ни один из вышеперечисленных не хватает), спроектируйте два Xibs и загрузите соответствующий в контроллер вида.
Чтобы определить размер экрана:
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
CGSize result = [[UIScreen mainScreen] bounds].size;
if(result.height == 480)
{
// iPhone Classic
}
if(result.height == 568)
{
// iPhone 5
}
}
Ответ 3
Единственная действительно необходимая вещь - добавить изображение запуска с именем "Default-568h@2x.png" к ресурсам приложения, и в общем случае (если вам повезет) приложение будет работать правильно.
Если приложение не обрабатывает события касания, убедитесь, что ключевое окно имеет нужный размер. Обходным путем является установка правильного кадра:
[window setFrame:[[UIScreen mainScreen] bounds]]
При переходе на iOS существуют другие проблемы, не связанные с размером экрана. 6. Подробнее читайте Примечания к выпуску iOS 6.0.
Ответ 4
Иногда (для приложений до раскадровки), если макет будет достаточно другим, стоит указать другой xib в соответствии с устройством (см. этот вопрос - вам нужно будет изменить код для работы с iPhone 5) в initController init, так как никакое количество операций с автоматическими масками не будет работать, если вам нужна другая графика.
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
NSString *myNibName;
if ([MyDeviceInfoUtility isiPhone5]) myNibName = @"MyNibIP5";
else myNibName = @"MyNib";
if ((self = [super initWithNibName:myNibName bundle:nibBundleOrNil])) {
...
Это полезно для приложений, ориентированных на более старые версии iOS.
Ответ 5
Здесь вы можете найти хороший учебник (для MonoTouch, но вы также можете использовать информацию для проектов Non-MonoTouch):
http://redth.info/get-your-monotouch-apps-ready-for-iphone-5-ios-6-today/
-
Создайте новое изображение для экрана всплеска/по умолчанию (640 x 1136 пикселей) с именем " Default-568h@2x.png"
-
В симуляторе iOS перейдите в меню "Оборудование → устройство" и выберите " iPhone (Retina 4-inch)"
-
Создайте другие изображения, например. фоновые изображения
- Обнаружение iPhone 5 для загрузки новых изображений:
public static bool IsTall
{
get {
return UIDevice.currentDevice.userInterfaceIdiom
== UIUserInterfaceIdiomPhone
&& UIScreen.mainScreen.bounds.size.height
* UIScreen.mainScreen.scale >= 1136;
}
}
private static string tallMagic = "-568h@2x";
public static UIImage FromBundle16x9(string path)
{
//adopt the -568h@2x naming convention
if(IsTall())
{
var imagePath = Path.GetDirectoryName(path.ToString());
var imageFile = Path.GetFileNameWithoutExtension(path.ToString());
var imageExt = Path.GetExtension(path.ToString());
imageFile = imageFile + tallMagic + imageExt;
return UIImage.FromFile(Path.Combine(imagePath,imageFile));
}
else
{
return UIImage.FromBundle(path.ToString());
}
}
Ответ 6
Легко переносить iPhone5 и iPhone4 через XIB.........
UIViewController *viewController3;
if ([[UIScreen mainScreen] bounds].size.height == 568)
{
UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone5screen" bundle:nil] autorelease];
}
else
{
UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone4screen" bundle:nil] autorelease];
}
Ответ 7
Я решаю эту проблему здесь. Просто добавьте ~ 568h @2x суффикс к изображениям и ~ 568h к xib. Нет необходимости в дополнительных проверках времени выполнения или изменениях кода.
Ответ 8
Я добавил новое стартовое изображение по умолчанию и (при проверке нескольких других ответов SE) удостоверился, что все мои раскадровки автоматически изменили размеры самих себя и подпредставлений, но сетчатка 4 дюйма все еще была коробкой.
Затем я заметил, что в моем информационном списке есть позиция для " Launch image ", установленная в " Default.png ", которую я таким образом удалил, и магический почтовый ящик больше не появлялся. Надеюсь, это спасет кого-то еще от того же безумия, которое я пережил.
Ответ 9
Чтобы определить, может ли ваше приложение поддерживать iPhone 5 Retina, используйте это:
(Это может быть более надежным, чтобы вернуть тип отображения, 4S Retina и т.д., Но, как написано ниже, он просто возвращается, если iPhone поддерживает Retina как iOS5 как ДА или НЕТ)
В общем файле ".h" добавьте:
BOOL IS_IPHONE5_RETINA(void);
В общем файле ".m" добавьте:
BOOL IS_IPHONE5_RETINA(void) {
BOOL isiPhone5Retina = NO;
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
if ([UIScreen mainScreen].scale == 2.0f) {
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);
if(result.height == 960){
//NSLog(@"iPhone 4, 4s Retina Resolution");
}
if(result.height == 1136){
//NSLog(@"iPhone 5 Resolution");
isiPhone5Retina = YES;
}
} else {
//NSLog(@"iPhone Standard Resolution");
}
}
return isiPhone5Retina;
}
Ответ 10
В файле constants.h
вы можете добавить эти инструкции define:
#define IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
#define IS_IPHONE UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
#define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON)
#define IS_IPHONE_5 (!IS_IPAD && IS_WIDESCREEN)
Ответ 11
Я предполагаю, что он не будет работать во всех случаях, но в моем конкретном проекте он избегал дублирования NIB файлов:
Где-то в common.h
вы можете сделать эти определения основаны на высоте экрана:
#define HEIGHT_IPHONE_5 568
#define IS_IPHONE ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 ([[UIScreen mainScreen] bounds ].size.height == HEIGHT_IPHONE_5)
В вашем базовом контроллере:
- (void)viewDidLoad
{
[super viewDidLoad];
if (IS_IPHONE_5) {
CGRect r = self.view.frame;
r.size.height = HEIGHT_IPHONE_5 - 20;
self.view.frame = r;
}
// now the view is stretched properly and not pushed to the bottom
// it is pushed to the top instead...
// other code goes here...
}
Ответ 12
Прежде всего создайте два xibs и прикрепите все делегаты, основной класс к xib
, а затем u можете поместить это условие, упомянутое ниже, в ваш appdelegate.m
файл в
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
if ([[UIScreen mainScreen] bounds].size.height == 568)
{
self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone5" bundle:nil];
}
else
{
self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone4" bundle:nil];
}
вы можете использовать его в любом месте программы в зависимости от ваших требований даже в ваших классах ViewController
. Самое главное, что вы создали два xib
файла, разделенных для iphone 4(320*480) and iphone 5(320*568)
Ответ 13
Проверка bounds
с помощью 568
не будет выполнена в альбомном режиме. iPhone 5 запускается только в портретном режиме, но если вы хотите поддерживать вращения, то для проверки этого сценария также потребуется обработать iPhone 5.
Здесь макрос, который обрабатывает состояние ориентации:
#define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136)))
Использование вызова "preferredMode" происходит из другого сообщения, которое я прочитал несколько часов назад, поэтому я не придумал эту идею.
Ответ 14
Вы можете использовать функцию Auto Layout
и создать дизайн с использованием разрешения экрана iPhone 5, и он будет работать для обоих 4-дюймовых и 3,5-дюймовых устройств, но в этом случае у вас должно быть достаточно знаний менеджера компоновки.
Ответ 15
Попробуйте метод ниже в одном классе:
-(NSString *)typeOfDevice
{
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
CGSize result = [[UIScreen mainScreen] bounds].size;
if(result.height == 480)
{
return @"Iphone";
}
if(result.height == 568)
{
return @"Iphone 5";
}
}
else{
return @"Ipad";;
}
return @"Iphone";
}
Ответ 16
Я никогда не сталкивался с такой проблемой с каким-либо устройством, поскольку у меня была одна кодовая база для всех без каких-либо жестко заданных значений. То, что я делаю, - это изображение максимального размера как ресурс вместо одного для каждого устройства. Например, у меня будет один для отображения сетчатки и показать его как подходящий для аспект, так что он будет отображаться как на каждом устройстве.
Принятие решения о кадре кнопки, например, во время выполнения. Для этого я использую значение% видения патента, например, если я хочу, чтобы ширина половины родительского представления составляла 50% от родительского, и то же самое относится к высоте и центру.
При этом мне даже не нужны xibs.
Ответ 17
Сначала покажите это изображение. На этом изображении вы увидите предупреждение для поддержки Retina 4, поэтому нажмите на это предупреждение и нажмите "Добавить", чтобы ваш экран Retina 4 автоматически добавлял ваш проект.
![Show image here]()
и после использования этого кода:
if([[UIScreen mainScreen] bounds].size.height == 568)
{
// For iphone 5
}
else
{
// For iphone 4 or less
}
Ответ 18
Вы можете использовать это определение, чтобы рассчитать, используете ли вы iPhone 5 на основе размера экрана:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
затем используйте простой оператор if
:
if (IS_IPHONE_5) {
// What ever changes
}
Ответ 19
Питер, вы должны действительно взглянуть на Canappi, он делает все это для вас, все, что вам нужно сделать, это указать макет как таковой:
button mySubmitButton 'Sumbit' (100,100,100,30 + 0,88,0,0) { ... }
Оттуда Canappi создаст правильный код objective-c, который обнаружит устройство, на котором работает приложение, и будет использовать:
(100,100,100,30) for iPhone4
(100,**188**,100,30) for iPhone 5
Canappi работает как Interface Builder и Story Board вместе, за исключением того, что он находится в текстовой форме. Если у вас уже есть XIB файлы, вы можете конвертировать их, поэтому вам не нужно воссоздавать весь пользовательский интерфейс с нуля.
Ответ 20
Вы можете вручную проверить размер экрана, чтобы определить, на каком устройстве вы находитесь:
#define DEVICE_IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.height == 568)
float height = DEVICE_IS_IPHONE5?568:480;
if (height == 568) {
// 4"
} else {
// 3"
}
Ответ 21
Вы можете добавить этот код:
if(UI_USER_INTERFACE_IDIOM() == 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) {
NSLog(@"iPhone 4 Resolution");
}
if(result.height == 1136) {
NSLog(@"iPhone 5 Resolution");
}
}
else{
NSLog(@"Standard Resolution");
}
}
Ответ 22
Это реальный универсальный код, вы можете создать 3 разных сюжета:
Задайте свой универсальный проект и установите свой основной iPhone для iPhone с раскадрой iPhone5 и основной план iPad с iPad-раскадрой, теперь добавьте новую цель раскадровки для iphone и измените разрешение для iphone 4 или менее, теперь реализуйте свой AppDelegate.m
iPhone4/4s (то же самое для 3/3Gs) для iPhone5 и сделать проект универсальным, с новой целью раскадровки для iPad, теперь в AppDelegate.m под didFinishLaunching
добавьте этот код:
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
UIStoryboard *storyBoard;
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width *scale, result.height *scale);
//----------------HERE WE SETUP FOR IPHONE4/4s/iPod----------------------
if(result.height == 960){
storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
UIViewController *initViewController = [storyBoard instantiateInitialViewController];
[self.window setRootViewController:initViewController];
}
//----------------HERE WE SETUP FOR IPHONE3/3s/iPod----------------------
if(result.height == 480){
storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
UIViewController *initViewController = [storyBoard instantiateInitialViewController];
[self.window setRootViewController:initViewController];
}
}
return YES;
}
Таким образом, вы создали универсальное приложение для iPhone 3/3Gs/4/4s/5 Все гены iPod и все типы iPad
Не забудьте интегрировать все IMG с myImage.png
и myImage@2x.png
Ответ 23
По моему мнению, лучший способ справиться с такими проблемами и избежать пары условий, необходимых для проверки высоты устройства, заключается в использовании относительного кадра для представлений или любого элемента пользовательского интерфейса, который вы добавляете к себе, например: if вы добавляете некоторый элемент пользовательского интерфейса, который вы хотите, в нижней части окна или чуть выше панели вкладок, тогда вы должны взять y-начало относительно высоты вашего представления или относительно панели вкладок (если есть), и у нас есть свойство автоматического изменения размера Что ж. Я надеюсь, что это сработает для вас.
Ответ 24
Вместо того, чтобы использовать набор условных выражений, вы можете автоматически изменить размер своего вида, используя размер экрана.
int h = [[UIScreen mainScreen] bounds].size.height;
int w = [[UIScreen mainScreen] bounds].size.width;
self.imageView.frame = CGRectMake(20, 80, (h-200), (w-100));
В моем случае я хочу представление, которое заполняет пространство между некоторыми полями ввода вверху и некоторыми кнопками внизу, таким образом фиксированный верхний левый угол и переменная внизу справа на основе размера экрана. Мое приложение заполняет изображение с фотографией, сделанной камерой, поэтому я хочу получить все пространство, которое я могу получить.
Ответ 25
Если вам нужно преобразовать уже существующее приложение в универсальное, вам нужно выбрать соответствующий xib file- > show Utilities- > Show Size inspector.
В Инспекторе размеров вы можете увидеть Автосообщение, используя этот инструмент, который вы можете преобразовать в существующее приложение iOS.
Ответ 26
Используя xCode 5, выберите "Перенести в каталог активов" в разделе "Проект" > "Общие".
Затем используйте "Show in finder", чтобы найти образ запуска, вы можете фиктивно редактировать его как 640x1136, а затем перетащить его в каталог активов, как показано на рисунке ниже.
Убедитесь, что в разделе iOS7 и iOS6 R4 есть изображение размером 640x1136.. При следующем запуске приложения черные полосы исчезнут, а ваше приложение будет использовать 4-дюймовый экран
![enter image description here]()
Ответ 27
Я бы предложил использовать Autoresizing Mask в ваших приложениях в соответствии с вашим интерфейсом пользовательского интерфейса, это избавит вас от многих проблем и лучше, чем создавать различные интерфейсы для экранов iPhone 4 и 5.
Ответ 28
Заметьте, стоит отметить - в новом Xcode вы должны добавить этот файл изображения Default-568h@2x.png для активов
Ответ 29
Существует небольшая проблема при тестировании как на iOS-устройстве, так и на iOS-симуляторе. Похоже, что симулятор (XCode 6.0.1) дает переключаемые значения для ширины и высоты в [[UIScreen mainScreen] bounds].size
в зависимости от ориентации устройства.
Таким образом, это может быть проблемой при определении правильного размера физического экрана. Этот код также помогает отличать все поколения iPhone 2014.
- iPhone4s
- iPhone5 (и iPhone5)
- iPhone6 (и iPhone6 +)
Его также можно легко изменить, чтобы провести различие между, например, iPhone6 от iPhone6 +.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
{
if (iOSDeviceScreenSize.width > 568 || // for iOS devices
iOSDeviceScreenSize.height > 568) // for iOS simulator
{ // iPhone 6 and iPhone 6+
// Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone6
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone6" bundle:nil];
NSLog(@"loaded iPhone6 Storyboard");
}
else if (iOSDeviceScreenSize.width == 568 || // for iOS devices
iOSDeviceScreenSize.height == 568) // for iOS simulator
{ // iPhone 5 and iPod Touch 5th generation: 4 inch screen (diagonally measured)
// Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone5
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil];
NSLog(@"loaded iPhone5 Storyboard");
}
else
{ // iPhone 3GS, 4, and 4S and iPod Touch 3rd and 4th generation: 3.5 inch screen (diagonally measured)
// Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
storyboard = [UIStoryboard story boardWithName:@"MainStoryboard_iPhone" bundle:nil];
NSLog(@"loaded iPhone4 Storyboard");
}
}
else if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
{ // The iOS device = iPad
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPadnew" bundle:nil];
NSLog(@"loaded iPad Storyboard");
}
// rest my code
}
Ответ 30
Используйте функцию Auto Layout
для представлений. Он автоматически настроится на все разрешения.
Создайте два xib для контроллера с именем контроллера с суффиксом ~ iphone или ~ ipad. Во время компиляции Xcode будет использовать правильный xib на основе устройства.
Используйте классы размера, если вы хотите создать единый xib для iPhone и iPad, если представление достаточно просто для порта для iPhone и iPad.