IOS Autolayout - Как установить два разных расстояния между представлениями, зависит от высоты экрана
Я знаю, что чего-то не хватает, потому что это должно быть легко достичь.
Моя проблема в том, что у меня на моем "экране загрузки" (тот, который появляется сразу после всплеска) UIImageView с двумя разными изображениями для экрана размером 3,5 дюйма и 4 дюйма. В определенном месте этих изображений я помещаю один идентификатор UIActivityIndicator, чтобы сообщить пользователю, что приложение загружает что-то в фоновом режиме. Это место не одинаково для обоих изображений, потому что один из них, очевидно, выше, чем другой, поэтому я хочу установить ограничение автоопределения, которое позволяет мне отображать этот индикатор активности на разных высотах, зависит от того, работает ли приложение в iPhone 5 или нет.
Без Autolayout я бы установил frame.origin.y в представлении 300 (например), а затем в методе viewDidLoad ViewController, я бы спросил, работает ли приложение в iPhone 5, поэтому я бы изменил значение, например, на 350. Я не знаю, как это сделать с помощью Autolayout, и я думаю, что это должно быть довольно просто.
Ответы
Ответ 1
Вы можете создать выход NSLayoutConstraint
на вашем контроллере просмотра и подключить розетку к ограничению Y индикатора активности в вашем xib или раскадровке. Затем добавьте метод updateViewContraints
к вашему контроллеру представления и обновите константу ограничения в соответствии с размером экрана.
![ограничение связи с выходом]()
Вот пример updateViewConstraints
:
- (void)updateViewConstraints {
[super updateViewConstraints];
self.activityIndicatorYConstraint.constant =
[UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100;
}
Конечно, вы захотите ввести свои соответствующие значения вместо 200
и 100
. Вы можете определить некоторые именованные константы. Кроме того, не забудьте позвонить [super updateViewConstraints]
.
Ответ 2
Проблема ответа @Rob заключается в том, что вы должны сделать много кода для каждого ограничения.
Чтобы решить эту проблему, просто добавьте класс ConstraintLayout
к вашему коду и измените значение константы ограничения для устройства, которое вы хотите в IB:
![введите описание изображения здесь]()
//
// LayoutConstraint.swift
// MyConstraintLayout
//
// Created by Hamza Ghazouani on 19/05/2016.
// Copyright © 2016 Hamza Ghazouani. All rights reserved.
//
import UIKit
@IBDesignable
class LayoutConstraint: NSLayoutConstraint {
@IBInspectable
var 📱3¨5_insh: CGFloat = 0 {
didSet {
if UIScreen.main.bounds.maxY == 480 {
constant = 📱3¨5_insh
}
}
}
@IBInspectable
var 📱4¨0_insh: CGFloat = 0 {
didSet {
if UIScreen.main.bounds.maxY == 568 {
constant = 📱4¨0_insh
}
}
}
@IBInspectable
var 📱4¨7_insh: CGFloat = 0 {
didSet {
if UIScreen.main.bounds.maxY == 667 {
constant = 📱4¨7_insh
}
}
}
@IBInspectable
var 📱5¨5_insh: CGFloat = 0 {
didSet {
if UIScreen.main.bounds.maxY == 736 {
constant = 📱5¨5_insh
}
}
}
}
Не забывайте наследовать ограничение вашего класса от ConstraintLayout
Я скоро добавлю версию objective-c
Ответ 3
Основным инструментом в Auto Layout для управления позицией объектов пользовательского интерфейса является ограничение. Ограничение описывает геометрическую взаимосвязь между двумя видами. Например, у вас может быть ограничение, которое гласит:
"Правый край индикатора выполнения соединен с левым краем малейшего 40 точек пустого пространства между ними".
Это означает, что с помощью AutoLayout вы не можете выполнить настройку условной позиции в соответствии с режимом UIDevice, вместо этого вы можете создать макет представления, который изменит его, если, например. приложение работает на 3,5-дюймовом полноэкранном (IPhone4) или 4 'полноэкранном (IPhone5) на основе ограничений.
Итак, варианты для вашей проблемы с использованием ограничений:
1) найдите представление о своем макете, которое можно использовать для создания ограничения для позиционирования индикатора прогресса относительно. (выберите представление и панель прогресса с помощью кнопки CMD, затем используйте пункт меню "Редактор/Пин/Вертикальный интервал", чтобы создать вертикальное ограничение между двумя объектами)
2) создать абсолютное ограничение, чтобы привязать положение progressbar к краю экрана (сохранение пробела) или централизованно
Я нашел полезным этот урок об AutoLayout, который может быть полезен и вам:
http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2
Примечание: автоотключение работает только с IOS 6.
Ответ 4
Обычно я стараюсь оставаться в Interface Builder для установки ограничений. Дайвинг в коде, чтобы иметь больше контроля, обычно полезен, если у вас совершенно разные макеты на iPhone 4 и 6. Например:
Как уже упоминалось ранее, вы не можете иметь условные обозначения в Interface Builder, что при привязке ограничения к вашему контроллеру представления действительно подходит.
Ниже приведено краткое описание трех подходов к решению проблем автоматического макета для разных размеров экрана: http://candycode.io/how-to-set-up-different-auto-layout-constraints-for-different-screen-sizes/
Ответ 5
Новый способ, без написания ни одной строки!
Нет необходимости писать условия на устройстве, подобные этим: -
if device == iPhoneSE {
constant = 44
} else if device == iPhone6 {
constant = 52
}
Я создал библиотеку Помощник по макету, поэтому теперь вы можете обновлять ограничения для каждого устройства без написания одной строки кода.
![enter image description here]()
Шаг 1
Назначьте NSLayoutHelper для вашего ограничения
![enter image description here]()
Шаг 2
Обновите ограничение для нужного устройства
![enter image description here]()
Шаг 3
Запустите приложение и увидите ВОЛШЕБСТВО
![enter image description here]()