Подтвердить что ты не робот

Как я могу использовать один раскадровки для 4 "и 3,5" экранов iphone с автозапуском (ios6 + ios7)?

В то время как есть много вопросов и ответов о построении раскладки раскладки, которые будут работать как на размерах экрана 4 ", так и 3,5", я не нашел подходящего решения для следующего сценария.

Я использую автозапуск с ios6 (и ios7), и мне не нужно поддерживать landscpae или ipad. У меня есть UIView с несколькими subviews, которые должны выглядеть как макет ниже. Легко настроить ограничения автоопределения в раскадровке, чтобы они соответствовали размерам экрана. Мой вопрос: Как сделать автозапуск выбрать правильные ограничения в зависимости от размера экрана во время выполнения?

SCREEN MOCKUPS

Заметьте, что я НЕ ДОЛЖЕН использовать 2 разных раскадровки. Сделать это во всем моем приложении было бы большой работой, и мне пришлось бы подключить всех делегатов, точек доступа и действия на каждом раскадровке. Изменение экрана потребовало бы, чтобы я выполнял двойную работу.

Я пробовал 2 метода, чтобы сделать эту работу на одной раскадровке, но я не удовлетворен ни одним из них.

  • Двойные ограничения. Большее ограничение (50) имеет более высокий приоритет, чем нижнее ограничение (30). Проблема с этим подходом заключается в том, что при 3,5-дюймовом размере экрана автозапуск может выбрать только несколько ограничений нижнего приоритета - достаточно для удовлетворения макета, но оставит некоторые ограничения с высоким приоритетом.

double constraints

  • Подкласс NSLayoutConstraint. В этом методе все ограничения в раскадровке устанавливаются как NSDualLayoutConstraint. В коде инициализации NSDualLayoutConstraint константа ограничения изменяется на значение 3_5_constant, если размер экрана времени выполнения составляет 3,5 дюйма. Этот метод более детерминирован, но вы не можете увидеть 3.5-дюймовый макет в представлении конструктора интерфейса.

enter image description here


Если только ограничения компоновщика интерфейса имели вторичное постоянное значение, которое будет применяться, когда размер экрана составляет 3,5 дюйма, это решит мою проблему. Таким образом, я остаюсь с моим вопросом - как я могу правильно использовать один раскадровки для правильной компоновки своих подсмотров для размеров экрана 4 "и 3,5"?

4b9b3361

Ответ 1

Если вы хотите использовать только одну раскадровку, и вы не хотите использовать автоматическую компоновку, что сделало бы вашу жизнь намного проще для того, что вы показали на диаграмме, вам нужно будет расставить свои представления в коде.

Вам просто нужно определить, работает ли пользователь на 4-дюймовом устройстве и соответствующим образом отображает ваши представления.

#define IS_568_SCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)

if (IS_568_SCREEN) {
    // Lots of code to layout for 4" devices
} else {
    // Lots of code to layout for 3.5" devices
}

Однако, если вы собираетесь использовать автозапуск для этого, вы обнаружите, что это поможет вам сэкономить массу времени и кода. Вместо того, чтобы вручную компоновать каждый вид в коде с помощью решения, упомянутого выше, вам просто нужно обновить ограничения y и height в зависимости от устройства.

Учитывая эту диаграмму, показывающую, какое автоматическое выключение будет работать для вас и что вам нужно обновить вручную, это должно помочь составить лучшую картину того, сколько вы сэкономите при использовании автозапуска.

enter image description here

#define IS_568_SCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)

if (IS_568_SCREEN) {
    self.layoutConstraintY.constant = 50.0f;
    self.layoutConstraintHeight.constant = 248.0f;
} else {
    self.layoutConstraintY.constant = 30.0f;
    self.layoutConstraintHeight.constant = 220.0f;
}
[self layoutIfNeeded];

Ответ 2

Этот fooobar.com/questions/49886/... решил для меня ту же проблему.

Ключ делает IBOutlet для ограничения (например, высоты). Затем сделайте что-нибудь подобное

- (void)updateViewConstraints {
    [super updateViewConstraints];

    self.myConstraintFromIB.constant =
        [UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100;
}

Ответ 4

Как добавить дополнительный просмотр и включить в него квадрат? Дополнительный вид должен быть прозрачным, и никто его не видит. Задайте ограничения дополнительного представления для расширения с размером экрана и установите ограничения квадратного представления, чтобы они были центрированы в дополнительном поле. Выберите множитель для размера квадратного сечения относительно дополнительного блока