Ответ
Разница между .left/.right и .leading/.trailing заключается в поддержке интернационализации и направлении письма (Left-to-Right или Right-to-Left).
.leftи.right— абсолютные направления. Они всегда соответствуют левой и правой стороне экрана, независимо от языковых настроек пользователя..leadingи.trailing— логические направления. Они адаптируются под текущую локализацию:- Для языков с письмом слева направо (LTR), таких как английский или русский:
.leading=.left,.trailing=.right. - Для языков с письмом справа налево (RTL), таких как арабский или иврит:
.leading=.right,.trailing=.left.
- Для языков с письмом слева направо (LTR), таких как английский или русский:
Когда использовать:
- Используйте
.leadingи.trailingдля выравнивания текста, отступов (padding) и расположения элементов интерфейса, которые должны зеркально отображаться для RTL языков. Это рекомендуемый подход. - Используйте
.leftи.rightтолько для фиксированного, незеркалируемого позиционирования (например, для графических элементов, где направление имеет физический смысл).
Пример в SwiftUI:
VStack {
// Адаптивное выравнивание (рекомендуется)
Text("Hello, World!")
.frame(maxWidth: .infinity, alignment: .leading) // Слева для LTR, справа для RTL
.padding(.leading, 20) // Отступ будет адаптивным
// Фиксированное выравнивание
Text("Fixed Position")
.frame(maxWidth: .infinity, alignment: .topLeft) // Всегда в левом верхнем углу
}
Пример в UIKit (Auto Layout):
// Адаптивные констрейнты (рекомендуется)
let constraints = [
label.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 16),
label.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor, constant: -16)
]
// Фиксированные констрейнты
let fixedConstraints = [
label.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 16)
] Ответ 18+ 🔞
О, ну вот, смотри, подъехала классика, блядь! Вечная тема, про которую каждый второй джуниор нихуя не понимает, а потом удивляется, почему у арабов интерфейс ебётся, как угорелый.
Короче, слушай сюда, разница проще пареной репы, если не тупить.
Есть, условно, два вида направлений: тупые как пробка и умные, с адаптацией.
.left / .right — это вот эти тупые, ёпта. Они как прибитые гвоздями. Лево — это всегда левая сторона экрана. Право — всегда правая. Хоть ты араб, хоть инопланетянин с письмом снизу вверх. Они нихуя не меняются. Поставил кнопку .right — она и будет торчать справа, даже если весь текст на арабском идёт справа налево. Получится пиздец и дичь.
А вот .leading / .trailing — это уже умные, блядь. Они смотрят, откуда народ читать начинает.
- Читаем слева направо (как мы, или англичане)? Тогда
.leading— это.left, а.trailing— это.right. Всё логично. - А если пользователь араб и читает справа налево? Тогда, охуеть,
.leadingавтоматом становится.right, а.trailing—.left. Интерфейс зеркалится, как умный, и всё на своих местах. Красота, блядь!
Короче, когда что юзать:
.leading/.trailing— ВСЕГДА, СУКА, когда работаешь с текстом, отступами (padding), выравниванием элементов в ряду. Это золотой стандарт, чтобы не выглядеть конченым распиздяем на международной арене..left/.right— только в особых, ебучьих случаях. Например, когда ты рисуешь чисто графическую хуйню, где направление имеет физический смысл. Допустим, стрелка "свайпните вправо". Она должна быть направлена вправо всегда, даже для араба. Вот тут и юзай.right.
Смотри, как в коде это выглядит, чтобы совсем пиздец было понятно:
SwiftUI:
VStack {
// Правильно, по-умному (leading/trailing)
Text("Привет, мир!")
.frame(maxWidth: .infinity, alignment: .leading) // Будет слева для нас, справа для араба
.padding(.leading, 20) // Адаптивный отступ, ёба!
// По-старинке, по-тупому (left/right)
Text("Фиксированная позиция")
.frame(maxWidth: .infinity, alignment: .topLeft) // ВСЕГДА в левом углу, хоть трава не расти
}
UIKit (Auto Layout):
// Умные, адаптивные констрейнты (делай так!)
let goodConstraints = [
label.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 16),
label.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor, constant: -16)
]
// Тупые, фиксированные констрейнты (юзай только если реально надо)
let dumbConstraints = [
label.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 16) // Насрать на локализацию!
]
Запомни раз и навсегда: leading/trailing — твои лучшие друзья. left/right — как резкий пердеж в лифте: иногда неизбежен, но лучше без него.