iOS Autolayout - Как установить два разных расстояния между видами, зависит от высоты экрана

Я знаю, что что-то упустил, потому что это должно быть что-то легко достичь.

Моя проблема в том, что на моем "экране загрузки" (который появляется сразу после всплеска) отображается UIImageView с двумя разными изображениями для экрана размером 3,5 и 4 дюйма. В определенное место этих изображений я поместил один UIActivityIndicator, чтобы сообщить пользователю, что приложение загружает что-то в фоновом режиме. Это место не одинаково для обоих изображений, потому что одно из них, очевидно, выше, чем другое, поэтому я хочу установить ограничение автоматической разметки, которое позволит мне отображать индикатор активности на разных высотах, в зависимости от того, работает ли приложение в iPhone 5 или нет.

Без Autolayout я установил бы frame.origin.y вида на 300 (например), а затем в методе viewDidLoad ViewController я бы спросил, запущено ли приложение на iPhone 5, поэтому я d изменить значение, например, на 350. Я не знаю, как это сделать с помощью Autolayout, и я думаю, что это должно быть довольно просто.

4 ответа

Решение

Вы можете создать 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],

Проблема ответа @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Я скоро добавлю объективную версию

Новый способ, без единой строчки!

Нет необходимости писать такие условия на основе устройства:-

if device == iPhoneSE { 
   constant = 44 
} else if device == iPhone6 {
   constant = 52
}

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

Шаг 1

Назначьте NSLayoutHelper вашему ограничению

Шаг 2

Обновите ограничение для нужного устройства

Шаг 3

Запустите приложение и увидите МАГИЮ

Основным инструментом в Auto Layout для управления положением объектов пользовательского интерфейса являются ограничения. Ограничение описывает геометрические отношения между двумя представлениями. Например, у вас может быть ограничение, которое гласит: "Правый край индикатора выполнения соединен с левым краем ярлыка 40 точек пустого пространства между ними".

Это означает, что с помощью AutoLayout вы не можете выполнить настройку условного положения на основе режима UIDevice, скорее вы можете создать макет представления, который изменяет себя, например, если. приложение работает в полноэкранном режиме 3,5'(IPhone4) или 4' (IPhone5) в зависимости от ограничений.

Итак, варианты вашей проблемы с использованием ограничений:

1) найдите представление в вашем макете, которое можно использовать для создания ограничения для позиционирования индикатора выполнения. (выберите вид и индикатор выполнения с помощью кнопки CMD, затем используйте пункт меню "Редактор / Вывод / Вертикальный интервал" для создания вертикального ограничения между двумя объектами)

2) создать абсолютное ограничение, чтобы прикрепить позицию индикатора выполнения к краю экрана (оставляя место) или централизованно

Я нашел полезным это руководство по AutoLayout, которое также может быть полезным для вас: http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

Обратите внимание: autolayout работает только с IOS 6.

Я обычно всегда стараюсь оставаться в Интерфейсном Разработчике для установки ограничений. Погружение в коде, чтобы иметь больше контроля, обычно полезно, если у вас есть совершенно разные макеты на iPhone 4 и 6, например.

Как упоминалось ранее, вы не можете иметь условные выражения в Интерфейсном Разработчике, потому что связывание ограничения с вашим контроллером представления действительно удобно.

Вот краткое объяснение 3 подходов к решению проблем автоматической компоновки для экранов разных размеров: http://candycode.io/how-to-set-up-different-auto-layout-constraints-for-different-screen-sizes/

Другие вопросы по тегам