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