Какой у вас опыт работы с Auto Layout в iOS?

Ответ

Работал с Auto Layout через Interface Builder и программно. Использую constraints для создания адаптивных интерфейсов.

Основные подходы:

  1. Anchors API (рекомендуемый):

    view.addSubview(subview)
    subview.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
    subview.topAnchor.constraint(equalTo: view.topAnchor, constant: 16),
    subview.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
    subview.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
    subview.heightAnchor.constraint(equalToConstant: 100)
    ])
  2. UIStackView для группировки элементов

  3. Visual Format Language для сложных раскладок

Ключевые концепции:

  • Приоритеты constraints (priority от 1 до 1000)
  • intrinsicContentSize для виджетов с естественным размером
  • Content Hugging/Compression Resistance
  • Отладка через view.debugConstraints() и UIViewAlertForUnsatisfiableConstraints

Ответ 18+ 🔞

А, Auto Layout, говоришь? Ну это ж классика, блядь, наша ежедневная! Сидишь, бывает, такой, и думаешь: "Ну вот сейчас всё расставлю, красота будет". А потом смотришь на лог — а там constraints не сходятся, и ты уже охуеваешь тихонько.

Слушай, вот Interface Builder — это как готовый конструктор, вроде удобно, но иногда он творит такую дичь, что проще вручную написать, чем разбираться, куда он там эту привязку засунул. А программно — это уже твоё полное владение ситуацией, хотя и писанины, конечно, овердохуища.

Основные подходы, на которые я молюсь:

  1. Anchors API (это реально спасение, ёпта):

    view.addSubview(subview)
    subview.translatesAutoresizingMaskIntoConstraints = false // Это святое, блядь! Не забудь, а то всё полетит в пизду!
    NSLayoutConstraint.activate([
    subview.topAnchor.constraint(equalTo: view.topAnchor, constant: 16),
    subview.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
    subview.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16), // С минусом, блядь, не перепутай!
    subview.heightAnchor.constraint(equalToConstant: 100)
    ])

    Чисто, понятно, как божий день. Никакой этой старой каши с NSLayoutConstraint(item:attribute:relatedBy:toItem:attribute:multiplier:constant:), от которой мозг вытекает.

  2. UIStackView — это вообще магия, блядь. Засунул в него виджеты, и он сам их раскидал. Красота! Особенно когда динамический контент. Хули там выравнивать каждый элемент по отдельности?

  3. Visual Format Language — это уже для сложных раскладок, когда чувствуешь себя шаманом. Строки эти, как заклинания: "H:|-[view1]-[view2]-|". Мощно, но читаемость, конечно, так себе. Как будто на клинопяти пишешь.

А вот ключевые концепции, без которых ты просто в жопе:

  • Приоритеты constraints — от 1 до 1000. Это как в жизни: что важнее? Иногда надо сказать системе: "Слушай, вот это вот constraint — похуй, если не сойдётся, а вот этот — священный, блядь, его нарушать нельзя".
  • intrinsicContentSize — это когда виджет сам знает, какого он размера. UILabel, например. Удобно, но если он начнёт вести себя странно — готовься к дебагу, ёпта.
  • Content Hugging/Compression Resistance — вот это реально важно понять. Hugging — это "не дай мне растянуться больше, чем надо". Compression Resistance — "не дай мне сжаться, я важный!". Перепутаешь — и текст в кнопке обрежется, а ты потом час ищешь, в чём дело.
  • Отладка — это отдельная песня. view.debugConstraints() — твой лучший друг. А лог UIViewAlertForUnsatisfiableConstraints — это как крик души системы: "Чувак, блядь, я не могу всё это совместить, выбери что-то одно!". И там такие противоречия вылезают, что волосы дыбом встают.

В общем, сила в понимании, а не в тупом закидывании констрейнтов. Иначе получится как у того немого Герасима — стоит, мычит "Муму", а система его не понимает и в пизду швыряет.