В чем разница между .left и .leading (а также .right и .trailing) в iOS разработке?

Ответ

Разница между .left/.right и .leading/.trailing заключается в поддержке интернационализации и направлении письма (Left-to-Right или Right-to-Left).

  • .left и .rightабсолютные направления. Они всегда соответствуют левой и правой стороне экрана, независимо от языковых настроек пользователя.
  • .leading и .trailingлогические направления. Они адаптируются под текущую локализацию:
    • Для языков с письмом слева направо (LTR), таких как английский или русский: .leading = .left, .trailing = .right.
    • Для языков с письмом справа налево (RTL), таких как арабский или иврит: .leading = .right, .trailing = .left.

Когда использовать:

  • Используйте .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 — как резкий пердеж в лифте: иногда неизбежен, но лучше без него.