Разный пользовательский интерфейс для разных размеров iPAD

Наш проект выполняется для всех iPad, и мы столкнулись с проблемой, например, у нас есть 8 кнопок, расположенных вертикально на экране с ограничениями, добавленными в качестве вертикального интервала, они хорошо выглядят на iPad 9,7 дюйма, но они выглядят очень большими на iPad 12,9, поэтому вопрос в том, есть ли хороший способ использовать пространство экрана для чего-то лучшего, например, добавить дополнительный UIView, если это iPAD 12.9. Я изучал работу с классами размеров, но я считаю, что для всех iPAD существует один класс размеров, и я хочу, чтобы был способ иметь разные пользовательские интерфейсы для разных размеров iPAD с помощью построителя интерфейса.


person Shabarinath Pabba    schedule 20.06.2017    source источник
comment
Есть ли у вас примеры пользовательского интерфейса, которого вы хотите достичь?   -  person Sviatoslav Yakymiv    schedule 01.07.2017
comment
Разве это не то, что должен делать StackView? Проверьте это ..   -  person Sti    schedule 05.07.2017
comment
Вам не нужно добавлять UIView, вы можете достичь своей цели, установив ограничение надлежащим образом. Внутри ограничения есть много вариантов для установки вида, такого как Отношение, Приоритет, Соотношение сторон и т. Д.   -  person Shabbir Ahmad    schedule 05.07.2017


Ответы (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. Экран. Затем просто загрузите нужный экран, как если бы это был совершенно другой экран.

person Pochi    schedule 29.06.2017
comment
эй @Pochi, большое спасибо за ответ, это отличный способ использовать разные представления. но у меня был один вопрос: что, если вид, который я делаю, используя ваш способ, и этот вид занимает только определенную высоту? как мне это сделать вместо использования let screenRect : CGRect = UIScreen.main.bounds. что произойдет, если я не дам ему высоту? Кроме того, могу ли я использовать этот класс UIView в своей раскадровке? - person Shabarinath Pabba; 05.07.2017
comment
Первый вопрос: ничего не происходит, он будет отображаться правильно, если у него есть правильные ограничения. Вам нужно указать позицию (например, центр x и y), а также размер представления. Вам действительно не нужно указывать высоту, если все элементы в представлении имеют относительное положение друг к другу. Просто убедитесь, что верхний элемент имеет свое позиционирование относительно верхней части представления, затем элемент под ним относительно этого последнего элемента и так далее, пока последний элемент не будет иметь позицию относительно нижней части представления. Преимущество этого подхода в том, что вы можете разработать его в IB. - person Pochi; 06.07.2017
comment
Второй вопрос: Да. Если вы используете код, который я разместил выше, просто перетащите UIView в конструктор интерфейса. Затем установите его как тип вашего пользовательского представления. Он должен автоматически появиться в качестве предварительного просмотра. Но просто имейте в виду, что интерфейсный построитель (IB) для визуализации представления использует код внутри метода init?(coder aDecoder: NSCoder). И поскольку он вызывает loadViewFromNib, условия будут определять, какой XIB будет использоваться в качестве предварительного просмотра. - person Pochi; 06.07.2017
comment
И пока я не забыл, вот пост, в котором описывается, как это работает: (он немного устарел, но мало что изменилось) supereasyapps.com/blog/2014/12/15/ - person Pochi; 06.07.2017

Просто установите ограничения, как я предложил ниже. Взгляните на пример. a> я создал для вас.

  1. Укажите соотношение сторон кнопки.
  2. Задайте ширину, равную ширине родительского представления.
  3. Добавьте ограничение по центру по горизонтали в контейнере и по центру по вертикали в контейнере.
  4. Выберите свою кнопку, а затем перейдите к инспектору размеров и установите множитель ширины (например, 0,3 или 0,4 и т. д.).
  5. Затем установите множитель для «выровнять центр X по ..» (если вы хотите, чтобы ваша кнопка была слева от центра, установите множитель ниже 1, например 0,8, 0,7, 0,5 и т. д. И если вы хотите, чтобы ваша кнопка была справа от центра затем установите значение множителя больше 1, например 1,2 и т. д.).
  6. Установите значение множителя для «Выровнять центр y по…», как в шаге 5.

Все готово.. Просто запустите и проверьте.

Надеюсь, что это поможет вам.

person Amit Kumar    schedule 29.06.2017

Для этого можно использовать AutoLayout. Вы можете назначить базовую высоту соотношения сторон для ваших кнопок. Помните, что есть возможность установить отношение отношения «равно» или «меньше, чем равно». Вы можете использовать их вместо того, чтобы указывать точные ограничения. Таким образом, это заставит кнопку адаптировать высоту. Затем в коде вы можете просто проверить, достаточно ли места для рисования дополнительного uiview или нет. Это также решит проблему «Выглядит действительно большим».

Посмотрите здесь скриншот IB, чтобы увидеть, что я имею в виду: Нажмите «Отношение», чтобы увидеть эти настройки< /а>

person Rishabh    schedule 05.07.2017

Предположим, что вашими перьями являются 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]
person mikep    schedule 28.06.2017

Попробуй это

1. Снимите ограничения со всех ваших кнопок.

  1. Добавьте все свои кнопки в стек
  2. Поместите вертикальные ограничения в свой стек
  3. установить одинаковую высоту и ширину для кнопок просмотра стека
  4. Удалите высоту, если вы установили для любой кнопки
  5. Не устанавливайте высоту для просмотра стека, если вы хотите, чтобы он работал на разных устройствах.
person Fahad Malik    schedule 29.06.2017

Вы можете использовать это

Все кнопки встроены в представление и настроены на его ограничения для суперпросмотра.

  • обязательно добавьте к нему ограничения соотношения сторон.

Выберите все кнопки и добавьте ограничения

  • Равная ширина, равная высота, соотношение сторон
person Umesh Verma    schedule 05.07.2017