Наш проект выполняется для всех iPad, и мы столкнулись с проблемой, например, у нас есть 8 кнопок, расположенных вертикально на экране с ограничениями, добавленными в качестве вертикального интервала, они хорошо выглядят на iPad 9,7 дюйма, но они выглядят очень большими на iPad 12,9, поэтому вопрос в том, есть ли хороший способ использовать пространство экрана для чего-то лучшего, например, добавить дополнительный UIView, если это iPAD 12.9. Я изучал работу с классами размеров, но я считаю, что для всех iPAD существует один класс размеров, и я хочу, чтобы был способ иметь разные пользовательские интерфейсы для разных размеров iPAD с помощью построителя интерфейса.
Разный пользовательский интерфейс для разных размеров iPAD
Ответы (6)
Как я представляю вашу ситуацию, так это то, что этот конкретный ViewController имеет много общего (например, общую верхнюю панель или панель навигации), но только средний контент не подходит должным образом.
В подобных случаях рекомендуется иметь собственный UIView, который будет загружать другой xib-файл в зависимости от высоты или ширины текущего устройства.
Ключевым моментом здесь является то, что на самом деле вам нужен только один подкласс UIView.
Для этого вы также можете использовать @IBDesignable для предварительного просмотра в режиме реального времени внутри конструктора интерфейса.
Чтобы достичь этого, вы должны выполнить следующие шаги.
1) Создайте файл .xib для каждого из ваших «UIViews» на основе размеров.
2) Создайте подкласс UIView.
3) Прицепите свойства из построителя интерфейса к этому подклассу. Обратите внимание, что вы должны повторить этот процесс для каждого из файлов xib, которые вы хотите использовать. ВАЖНО: Несмотря на то, что это разные xibs, все они связаны с одним и тем же классом.
4) Отметьте созданный класс как @IBDesignable следующим образом.
@IBDesignable class CustomView: UIView {
...
}
5) Добавьте следующий код в свой класс, который будет загружать другой xib на основе любых выбранных вами критериев.
////////// View Logic //////////
// Our custom view from the XIB file
var view: UIView!
func xibSetup() {
view = loadViewFromNib()
// use bounds not frame or it'll be offset
view.frame = bounds
// Make the view stretch with containing view
view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
// Adding custom subview on top of our view (over any custom drawing > see note below)
addSubview(view)
}
func setup()
{
// Extra setup goes here
}
func loadViewFromNib() -> UIView {
let bundle = Bundle(for: type(of: self))
let nib : UINib
let screenRect : CGRect = UIScreen.main.bounds;
// Use a different Nib based on the current screen height
if screenRect.size.height == 1024 {
// iPad Air & Pro
nib = UINib(nibName: "iPadNormal", bundle: bundle)
}
else if screenRect.size.height == 1366 {
// Large iPad Pro
nib = UINib(nibName: "iPadLarge", bundle: bundle)
}
else {
// Fall back
nib = UINib(nibName: "iPadFallback", bundle: bundle)
}
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
return view
}
override init(frame: CGRect) {
// 1. setup any properties here
// 2. call super.init(frame:)
super.init(frame: frame)
// 3. Setup view from .xib file
xibSetup()
// 4. Other Setup
setup()
}
required init?(coder aDecoder: NSCoder) {
// 1. setup any properties here
// 2. call super.init(coder:)
super.init(coder: aDecoder)
// 3. Setup view from .xib file
xibSetup()
// 4. Other Setup
setup()
}
////////////////
ВАЖНО:
Этот подход рекомендуется ТОЛЬКО, когда содержимое пользовательского представления такое же или с минимальными изменениями (макет не имеет значения). Если содержимое сильно меняется между размерами (например, вы действительно хотите отображать разные вещи), вам следует создать «BaseViewController» с вашей общей логикой и создать подкласс для размера iPad, чтобы каждый из них имел свой собственный ViewController + Interface Builder. Экран. Затем просто загрузите нужный экран, как если бы это был совершенно другой экран.
Просто установите ограничения, как я предложил ниже. Взгляните на пример. a> я создал для вас.
- Укажите соотношение сторон кнопки.
- Задайте ширину, равную ширине родительского представления.
- Добавьте ограничение по центру по горизонтали в контейнере и по центру по вертикали в контейнере.
- Выберите свою кнопку, а затем перейдите к инспектору размеров и установите множитель ширины (например, 0,3 или 0,4 и т. д.).
- Затем установите множитель для «выровнять центр X по ..» (если вы хотите, чтобы ваша кнопка была слева от центра, установите множитель ниже 1, например 0,8, 0,7, 0,5 и т. д. И если вы хотите, чтобы ваша кнопка была справа от центра затем установите значение множителя больше 1, например 1,2 и т. д.).
- Установите значение множителя для «Выровнять центр y по…», как в шаге 5.
Все готово.. Просто запустите и проверьте.
Надеюсь, что это поможет вам.
Для этого можно использовать AutoLayout. Вы можете назначить базовую высоту соотношения сторон для ваших кнопок. Помните, что есть возможность установить отношение отношения «равно» или «меньше, чем равно». Вы можете использовать их вместо того, чтобы указывать точные ограничения. Таким образом, это заставит кнопку адаптировать высоту. Затем в коде вы можете просто проверить, достаточно ли места для рисования дополнительного uiview или нет. Это также решит проблему «Выглядит действительно большим».
Посмотрите здесь скриншот IB, чтобы увидеть, что я имею в виду: Нажмите «Отношение», чтобы увидеть эти настройки< /а>
Предположим, что вашими перьями являются Foo_pro.xib и Foo_ipad.xib.
@implementation Util
+(BOOL) isIpad_1024
{
if ([UIScreen mainScreen].bounds.size.height == 1024) {
return YES;
}
return NO;
}
+(BOOL) isIpadPro_1366
{
if ([UIScreen mainScreen].bounds.size.height == 1366) {
return YES;
}
return NO;
}
+(NSString *)convertXib:(NSString *)nibName {
if([Util isiPadPro_1366]) {
return [NSString stringWithFormat:@"%@_pro", nibName];
} else {
return [NSString stringWithFormat:@"%@_ipad", nibName];
}
}
Foo *foo = [[Foo alloc] initWithNibName:[Util convertXib:@"Foo"] bundle:nil]
Попробуй это
1. Снимите ограничения со всех ваших кнопок.
- Добавьте все свои кнопки в стек
- Поместите вертикальные ограничения в свой стек
- установить одинаковую высоту и ширину для кнопок просмотра стека
- Удалите высоту, если вы установили для любой кнопки
- Не устанавливайте высоту для просмотра стека, если вы хотите, чтобы он работал на разных устройствах.
Вы можете использовать это
Все кнопки встроены в представление и настроены на его ограничения для суперпросмотра.
- обязательно добавьте к нему ограничения соотношения сторон.
Выберите все кнопки и добавьте ограничения
- Равная ширина, равная высота, соотношение сторон