Помогите разобраться с формулой для constraints

constraints
swift4

#1

Нашел в документации такую формулу для расчета constraint.

Подскажите, плз, откуда здесь берется multiplier, который множитель? В данном случае он равен 1.0. В пояснениях говорится только то, что на него умножается значение attribute 2.


#2

Множитель указывается в конструкторе констрейнта (если создаешь обычный констрейнт без различных либ).


#3

да, он там присутствует. Но не въезжаю зачем он нужен, в чем его смысл?


#4

В основном для того, чтобы задавать соотношение сторон одного объекта. В той статье чуть ниже есть примеры:

// Give a view a constant aspect ratio
View.height = 2.0 * View.width + 0.0

// Setting a constant height
View.height = 0.0 * NotAnAttribute + 40.0


#5

так а что он означает? Вся эта формула какая-то странная. Предположим, надо задать расстояние по горизонтали между двумя вьюверами - BlueView and RedView, как в первом примере.

Почему нельзя просто написать:
BlueView.trailing = 8, RedView.leading = 0

Зачем здесь вдруг появляются и этот множитель, а еще и константа? Я понимаю, что можно выставить констрэйнт в билдере и не париться. Но вот начал делать более сложный макет, и элементы разъезжаются, хотя вроде все сделано по образцу, как и раньше. Приходится возвращаться и разбираться в деталях, на простых примерах. Отсюда и вопрос - что за смысл в этой формуле, как ею пользоваться?


#6

Вот тебе задача:
надо чтобы вьюха сверху пропорционально менялась в зависимости от устройств. Если на SE высота экрана условно, 568, и вьюха занимает 1/3, то как ты ее правильно покажешь на других экранах? Например на X, где высота 812?


#7

вот именно эту задачу я и пытаюсь решить. На сегодняшний день есть только позиционирование и размеры элемента. Т.е. в твоем конкретном примере, можно задать констрэйнты по высоте - top и bottom. Они будут фиксированные, а размер элемента по высоте будет не фиксированный. Отсюда, констрэйнты будут растягивать элемент на тех экранах, где размер больше.

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

В итоге получается, что констрэйнты решают вопрос только частично. С их помощью можно только фиксировать расстояния с четырех сторон элемента или размеры (высоту и ширину) самого элемента. Но в ряде случаев это не работает, или работает не так, как хотелось бы. Ниже три скрина с примерами. 1- исходный лэйбл на айфоне 8, второй - как выглядит на айпаде сейчас при фиксированных констрэйнтах (сверху, слева, справа), и 3-й как хотелось бы, т.е. чтобы и размеры и констрэйнты со всех сторон увеличивались бы пропорционально.


#8

Вы просто не полностью их освоили
Например есть возможность привязать высоту выбранного вами лебла к высоте экрана. И вот там как раз и нужно будет использовать множитель.

YourLabel.height = 0.1 * View.height

#9

так а как это конкретно реализовать? Например, в сториборде на экране есть label, от него outlet во ViewController. Дальше, через viewDidLoad пытаюсь найти свойство height, но там его нет. Есть только heightAnchor.

И как дальше найти height во View?

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var firstLabel: UILabel!        

    override func viewDidLoad() {
        super.viewDidLoad()
        
        firstLabel.heightAnchor = 0.1 * View.height // Здесь выдает ошибку            

    }     
}

#10

я вам привел пример формулы о которой был вопрос.
Почитайте как добавлять констрейнты. У вас есть недопонимание в этом вопросе


#11

ну да, есть недопонимание, поэтому я и прошу помощи у тех, у кого есть понимание. Перерыл уже кучку документации и форумов, там иногда про эту формулу говорят, но в общем. Можно какой-нибудь пример, чтобы посмотреть как она работает?