Как я могу использовать один раскадровки для 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"?
Ответы
Ответ 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;
}
Ответ 3
Вам необходимо будет изменить свои ограничения программно. Вы можете найти этот вопрос полезным для этого.
У вас также может быть два отдельных файла раскадровки или две сцены viewController в одном файле раскадровки.
Ответ 4
Как добавить дополнительный просмотр и включить в него квадрат? Дополнительный вид должен быть прозрачным, и никто его не видит. Задайте ограничения дополнительного представления для расширения с размером экрана и установите ограничения квадратного представления, чтобы они были центрированы в дополнительном поле. Выберите множитель для размера квадратного сечения относительно дополнительного блока