iOS: использовать модификаторы устройства для загрузки файлов XIB? - PullRequest
49 голосов
/ 04 марта 2011

Вы можете использовать модификатор устройства (т. Е. ~ Ipad), чтобы предоставить ключ для конкретного устройства в Info.plist и указать образ запуска для устройства (Default.png для iPhone и Default ~ ipad.png дляiPad, например).Эти две вещи конкретно упоминаются в Apple Docs , но они не говорят, что это будет работать для любых других типов файлов.

Я обнаружил (совершенно случайно), что этоработает для загрузки .xib файлов через initWithNibName:bundle:.Так, например, у меня могут быть MyView.xib и MyView ~ ipad.xib, и этот код:

MyViewController *viewController = [[MyViewController alloc] 
                                     initWithNibName:@"MyView" bundle:nil];

... полностью загрузит MyView ~ ipad.xib на iPad, а MyView.xib надругие устройства.

Итак, 1) Это где-то задокументировано?Я уверен, что не смог найти ни одного документа Apple.Это, безусловно, удобнее, чем проверка UI_USER_INTERFACE_IDIOM () и жесткое кодирование двух разных имен перьев везде, но я вроде бы не доверяю этому, если оно не задокументировано.

И, 2) Кто-нибудь знает, какая версия iOS началасьработает в?Я только попробовал это в 4.2, и это работает там.Модификаторы устройства в целом (даже для документированных вещей, перечисленных выше) - минимум 4,0.

Ответы [ 4 ]

50 голосов
/ 04 марта 2011

У меня была такая же проблема.Поначалу ответ не имел смысла, но хорошая новость в том, что это легко сделать!:)

Просто назовите свои айбоны iPad без какого-либо модификатора, а свои айбоны iPhone - ~ iphone, и он выберет их правильно.

Итак, с MyViewController у вас будет MyViewController.xibдля iPad и MyViewController~iphone.xib для iPhone.Затем вы можете просто инициализировать свой контроллер представления с помощью простого alloc / init.

[[MyViewController alloc] init], и он получит правильный xib.

Итак, когда я создаю новый контроллер представления в XCode,Я всегда выбираю поле, чтобы отформатировать его для ipad, потому что создаваемая им xib будет называться MyViewController.xib, и вы хотите, чтобы она была размером xib для iPad.Затем я создаю второй xib, отформатированный для iPhone, и называю его модификатором ~ iphone.

Временами документация немного противоречива, но на этой странице рассказывается о том, как ресурсы с идентификатором по умолчанию будут иметь iPad.

ImageSoundResources

Проверьте раздел об использовании изображений в высоком разрешении.Я знаю, что мы говорим о xibs, а не об изображениях, но это работает.Мои последние 6 приложений использовали эту идиому.

25 голосов
/ 27 апреля 2011

На самом деле, это явно определено в документах, но в виде сноски.

CocoaNibs

В примечании внизу «Загрузка файлов NIB с использованием NSBundle»":

Примечание. Если вы разрабатываете универсальное приложение для iOS, вы можете использовать соглашения об именах, относящиеся к конкретному устройству, для автоматической загрузки правильного файла пера для базового устройства.Для получения дополнительной информации о том, как назвать ваши nib-файлы, см. «IOS поддерживает специфичные для устройства ресурсы».

Который ссылается на Какао Концептуальная загрузка ресурсов

Однако,да, это только 4.0+ функция.

3 голосов
/ 09 марта 2011

Я ненавижу быть этим парнем и отвечать на свой вопрос, но я думаю, что ответ:

1) Нет, явно не задокументировано в какой-либо документации Apple, и
2) 4.0 и выше (основано на моем собственном тестировании)

Все, что вы действительно экономите, это пара строк проверки кода для UI_USER_INTERACE_IDIOM (). Тем не менее, я возьму это. Меньше кода - меньше кода.

2 голосов
/ 04 марта 2011

Подходящим методом для использования в iOS 3.2 и новее является функция UI_USER_INTERFACE_IDIOM().Обычно я использую троичный оператор для инициализации UIViewController с соответствующей XIB.

UIViewController* controller = [[UIViewController alloc] 
    initWithNibName:UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? 
    @"YourViewController-iPad" : @"YourViewController" andBundle:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...