С вашей Main.storyboard:
<label opaque="NO"
userInteractionEnabled="NO"
contentMode="left"
horizontalHuggingPriority="251"
verticalHuggingPriority="251"
text="Storyboard example"
textAlignment="natural"
lineBreakMode="tailTruncation"
baselineAdjustment="alignBaselines"
adjustsFontSizeToFit="NO"
translatesAutoresizingMaskIntoConstraints="NO"
id="HPb-Ly-SNL">
<constraints>
<constraint firstItem="HPb-Ly-SNL"
firstAttribute="centerY"
secondItem="fsQ-UL-Fbk"
secondAttribute="centerY"
id="0Up-NL-qsu"/>
<constraint firstItem="fsQ-UL-Fbk"
firstAttribute="trailing"
relation="greaterThanOrEqual"
secondItem="HPb-Ly-SNL"
secondAttribute="trailing"
constant="15"
id="7xt-tj-mzn"/>
<constraint firstItem="HPb-Ly-SNL"
firstAttribute="leading"
relation="greaterThanOrEqual"
secondItem="fsQ-UL-Fbk"
secondAttribute="leading"
constant="15"
id="Gyk-6R-ri3"/>
<constraint firstItem="HPb-Ly-SNL"
firstAttribute="centerX"
secondItem="fsQ-UL-Fbk"
secondAttribute="centerX"
id="axh-b8-nGS"/>
</constraints>
<viewLayoutGuide key="safeArea" id="fsQ-UL-Fbk"/>
У вас есть (я только добавил пробелы и удалил ненужные части):
let leadingConstraint = NSLayoutConstraint(item: programmaticallyLabel,
attribute: .leading,
relatedBy: .greaterThanOrEqual,
toItem: view.safeAreaLayoutGuide,
attribute: .leading,
multiplier: 1,
constant: 15)
let trailingConstraint = NSLayoutConstraint(item: programmaticallyLabel,
attribute: .trailing,
relatedBy: .greaterThanOrEqual,
toItem: view.safeAreaLayoutGuide,
attribute: .trailing,
multiplier: 1,
constant: 15)
let horizontalConstraint = NSLayoutConstraint(item: programmaticallyLabel,
attribute: .centerX,
relatedBy: .equal,
toItem: view.safeAreaLayoutGuide,
attribute: .centerX,
multiplier: 1,
constant: 0)
let verticalConstraint = NSLayoutConstraint(item: programmaticallyLabel,
attribute: .centerY, relatedBy: .equal,
toItem: view.safeAreaLayoutGuide,
attribute: .centerY,
multiplier: 1,
constant: 0)
Почти все согласны, НО, есть разница.
let trailingConstraint = NSLayoutConstraint(item: programmaticallyLabel,
attribute: .trailing,
relatedBy: .greaterThanOrEqual,
toItem: view.safeAreaLayoutGuide,
attribute: .trailing,
multiplier: 1,
constant: 15)
против
<constraint firstItem="fsQ-UL-Fbk"
firstAttribute="trailing"
relation="greaterThanOrEqual"
secondItem="HPb-Ly-SNL"
secondAttribute="trailing"
constant="15"
id="7xt-tj-mzn"/>
Порядок отличается.
Вы можете использовать отрицательные значения в качестве константы, и если в Интерфейсном Разработчике вы выбираете чтобы изменить порядок элементов, значение становится отрицательным / положительным.
Здесь в раскадровке первый элемент (id) - это SafeArea, а метка - второй. В коде все наоборот.
Таким образом, вместо этого вы можете использовать константу -15 или изменить порядок по коду двух элементов. Кроме того, возможно, в greatThanOrEqual может потребоваться изменение (на lessThanOrEqual
, потому что это трейлинг).
В раскадровке:
В настоящее время у вас есть: ![Current Situation](https://i.stack.imgur.com/YJSdC.png)
Вы можете изменить: ![Reverse Order in Interface](https://i.stack.imgur.com/BWoZ5.png)
У вас будет:
![Reversed Value](https://i.stack.imgur.com/FRp1q.png)
Открытие XML Раскадровки:
<constraint firstItem="HPb-Ly-SNL"
firstAttribute="trailing"
relation="lessThanOrEqual"
secondItem="fsQ-UL-Fbk"
secondAttribute="trailing"
constant="-15"
id="7xt-tj-mzn"/>