Как сделать xib совместимым с устройствами iphone 5 и iphone 4
Я пытаюсь разместить мой xib так, чтобы макет вписывался как в iphone 5 (4 дюйма сетчатки), так и в 3,5 устройства.
Поскольку мне нужно поддерживать IOS-5, я не могу использовать автозапуск. Я должен использовать пружины и Struts.
Я пробовал все в интерфейсе-строителе. Но либо мой взгляд выходит за пределы iphone-3,5 дюйма или не полностью заполняет iphone-4-inch-retina.
Может кто-нибудь подскажет, как на самом деле сделать xib совместимым с обоими устройствами?
Для большей ясности я добавляю скриншоты:
Когда я установил размер 3.5 в инспекторе атрибутов:
![When I set size in attribute inspector to 3.5]()
он выглядит в iphone-5. Под кнопками находится пробел:
![And this is how it looks in simulator for 3.5 inch device]()
Если я установил размер 4 дюйма в построителе интерфейса. Вы можете видеть, что нижние кнопки не видны в iphone-4.
![If I set size 3.5 inch in interface builder]()
Итак, вы спросите, какие настройки я использую. Вот они:
![enter image description here]()
![enter image description here]()
![enter image description here]()
Ответы
Ответ 1
-
Вы добавляете новую категорию для UIviewController и добавляете этот код в файл .h
- (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil;
-
Добавьте этот код в свой .m файл
- (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil
{
if (self = [super init])
{
self = [self initWithNibName:[self CheckDeviceIphone4:nibNameOrNil4 Iphone5:nibNameOrNil5 Ipad:nibNameOrNilpad] bundle:nibBundleOrNil];
}
return self;
}
-(NSString *)CheckDeviceIphone4:(NSString *)iphone4 Iphone5:(NSString *)iphone5 Ipad:(NSString *)ipad {
return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) ? ipad :([[UIScreen mainScreen] bounds].size.height == 568) ? iphone5 :iphone4;
}
-
Откройте файл YouProject-Prefix.pch и импортируйте свою категорию здесь
-
теперь вы просто используете это во всем проекте, как этот
self.firstView=[[firstView alloc]initWithNibNameforIphone4:@"firstView4" NibNameforIphone5:@"firstView" NibNameforIpad:@"firstViewIpad" bundle:[NSBundle mainBundle]];
спасибо и любой вопрос, тогда комментируйте и не забывайте повышать: -)
\
Ответ 2
Попробуйте добавить это ко всем вашим контроллерам, которым необходимо поддерживать iPhone 5:
- (void) loadView
{
[super loadView];
self.view.frame = [UIScreen mainScreen].bounds;
}
Ответ 3
Просто установите размер представления в None с помощью Interface-builder
Он будет иметь размер просмотров во время выполнения, просто вам нужно позаботиться о происхождении и автосоздании для каждого элемента (UILabel, UIImage и т.д.) В представлении.
- Interface-builder (XIB) → Attribute Inspector → Имитированные показатели - Размер: Нет
![enter image description here]()
Ответ 4
Я боролся с этим сегодня, и независимо от того, что я делал, мои взгляды всегда показывались как 320x480, даже при работе на симуляторе сетчатки 4. Даже [UIScreen mainScreen].bounds возвращал 320x480!
Я обнаружил, что добавление образа запуска [email protected] стало ключом к тому, чтобы iOS распознал мое приложение как "готовое Retina 4". Как только я это сделал, я обнаружил, что не должен был ничего делать, чтобы получить nibs для автоматического размера без черных полосок Нет необходимости иметь два отдельных xibs, изменять настройки в Interface Builder, переопределять loadView и т.д.
Ответ 5
Вам не нужно использовать другой наконечник для 3,5-дюймовых и 4-дюймовых устройств. Создайте приложение для 4-дюймового устройства и правильно настройте AutoResizingMask, и он должен работать правильно.
В вашем случае просто установите для параметра AutoResizingMask значение
[view setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];
Маска авторезистировки правильно помещает представление в свое положение на обоих устройствах.
Ответ 6
Если вы решите использовать 2 xib файла; в вашем методе initWithNibName() просто сделайте вызов super с другим именем nib.
Я бы тестировал оригинальное измерение 480 высоты, а не на высоте 568, чтобы увеличить размер файла xib, когда Apple выпустит более крупный экран. В будущем, по крайней мере, более крупный xib не будет помещен в буклете размером с меньший.
// From MainView.m
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
CGSize result = [[UIScreen mainScreen] bounds].size;
if(result.height == 480)
{
// iPhone Classic
self = [super initWithNibName:@"MainView" bundle:nibBundleOrNil];
}
else
{
// iPhone 5 or maybe a larger iPhone ??
self = [super initWithNibName:@"MainView5" bundle:nibBundleOrNil];
}
return self;
}
Ответ 7
У меня есть идея. Отделите свой пользовательский интерфейс на заголовок, тело и нижний колонтитул (например, на веб-сайте). Затем в консоли вашего кода найдите в "Инспекторе размеров" и используйте автосоздание.
Обратите внимание на внешние линии квадрата, это ваше контрольное местоположение против основного вида. Установите элементы управления (панель навигации, UIImageView, UIButton и т.д.) В части заголовка и части тела, прикрепленной к вершине и элементам управления (закладка, закрытие и т.д.) В нижнем колонтитуле внизу.
Каждый раз, когда вы запускаете, элементы управления будут прикрепляться к их настройкам автосохранения. У вас будет пространство между заголовком/телом и нижним колонтитулом на iPhone 5, но я думаю, что это нормально.
Ответ 8
Определите условие ниже строки и проверки на основе устройства.
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 )
if (IS_IPHONE_5) {
btnBookmark.frame=CGRectMake(0, 460, 100, 70);
btnBookmark.frame=CGRectMake(150, 460, 100, 70);
}
else {
btnBookmark.frame=CGRectMake(0, 360, 100, 70);
btnBookmark.frame=CGRectMake(150, 360, 100, 70);
}
Ответ 9
У меня возникла проблема с 3.5 "против 4", и я неправильно понял, что было не так, поэтому я хотел документировать его здесь, если он помогает кому-либо.
Если вы пытаетесь получить доступ к self.view.frame
, это будет сообщено неправильно до viewDidAppear
или какого-либо подобного события. Если вы попытаетесь получить доступ к self.view.frame
из viewDidLoad
, то вы можете сообщить о размерах кадра перед тем, как произойдет автоматизация.
Ответ 10
Без использования автозапуска вам может потребоваться обработать много вещей в коде. Я предполагаю, что большая часть вашего макета может хорошо работать с пружинами и распорками, но некоторые элементы пользовательского интерфейса не могут просто вручную устанавливать рамки определенных объектов в соответствии с размером вашего вида.
Ответ 11
- В своем раскадровке нажмите "Показать инспектор файлов".
- В документе "Конструктор интерфейса" → "Управление версиями документов" выберите "Развертывание = iOS 5" (или ваш выбор).
Если это не сработает, вам нужно работать с каждым вашим видом.
Выберите их. В разделе "Инспектор атрибутов" для каждого из них в разделе "Вид" см. "Атрибут режима". Установите для этого значение "Перерисовать".
Если даже это не дает удовлетворительного результата, установите размер представления наименьшей из всех версий, которые вы собираетесь использовать. И установите атрибут Mode = 'Scale для заполнения'.
Программно, атрибут режима свойство view.contentmode.
Ответ 12
ivanzoid сниппета над этими запросами для всего размера экрана делает трюк, пока вы помните, чтобы вычесть смещения для навигации и панелей инструментов (всего 64 в большинстве условий).
Это высота представления, которую необходимо отрегулировать; пружины и стойки в противном случае позаботятся об этом.
Повторное тестирование моего приложения на iPhone 5 Мне нужно было сделать это только на одном экране с некоторыми настройками позиции управления временем выполнения. Каждый другой случай обрабатывается по умолчанию по умолчанию XIB.
Ответ 13
Если вы не хотите использовать два xib и заинтересованы в использовании Autosizing здесь
Ответ 14
Если ваш пользовательский интерфейс слишком сложный и содержит слишком много UIControl, то я предлагаю сделать следующее в viewDidLoad():
NSLog(@"Iphone %f ",[[UIScreen mainScreen] bounds].size.height);
if ([[UIScreen mainScreen] bounds].size.height == 568)
{
//design frames of your controls accordingly add add the controls as subview to
self.view
//this is iphone 5 xib
} else
{
//design frames of your controls accordingly add add the controls as subview to
self.view
// this is iphone 4 xib
}