Ответ
Работал с Auto Layout через Interface Builder и программно. Использую constraints для создания адаптивных интерфейсов.
Основные подходы:
-
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) ]) -
UIStackView для группировки элементов
-
Visual Format Language для сложных раскладок
Ключевые концепции:
- Приоритеты constraints (priority от 1 до 1000)
intrinsicContentSizeдля виджетов с естественным размером- Content Hugging/Compression Resistance
- Отладка через
view.debugConstraints()иUIViewAlertForUnsatisfiableConstraints
Ответ 18+ 🔞
А, Auto Layout, говоришь? Ну это ж классика, блядь, наша ежедневная! Сидишь, бывает, такой, и думаешь: "Ну вот сейчас всё расставлю, красота будет". А потом смотришь на лог — а там constraints не сходятся, и ты уже охуеваешь тихонько.
Слушай, вот Interface Builder — это как готовый конструктор, вроде удобно, но иногда он творит такую дичь, что проще вручную написать, чем разбираться, куда он там эту привязку засунул. А программно — это уже твоё полное владение ситуацией, хотя и писанины, конечно, овердохуища.
Основные подходы, на которые я молюсь:
-
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:), от которой мозг вытекает. -
UIStackView — это вообще магия, блядь. Засунул в него виджеты, и он сам их раскидал. Красота! Особенно когда динамический контент. Хули там выравнивать каждый элемент по отдельности?
-
Visual Format Language — это уже для сложных раскладок, когда чувствуешь себя шаманом. Строки эти, как заклинания:
"H:|-[view1]-[view2]-|". Мощно, но читаемость, конечно, так себе. Как будто на клинопяти пишешь.
А вот ключевые концепции, без которых ты просто в жопе:
- Приоритеты constraints — от 1 до 1000. Это как в жизни: что важнее? Иногда надо сказать системе: "Слушай, вот это вот constraint — похуй, если не сойдётся, а вот этот — священный, блядь, его нарушать нельзя".
intrinsicContentSize— это когда виджет сам знает, какого он размера. UILabel, например. Удобно, но если он начнёт вести себя странно — готовься к дебагу, ёпта.- Content Hugging/Compression Resistance — вот это реально важно понять. Hugging — это "не дай мне растянуться больше, чем надо". Compression Resistance — "не дай мне сжаться, я важный!". Перепутаешь — и текст в кнопке обрежется, а ты потом час ищешь, в чём дело.
- Отладка — это отдельная песня.
view.debugConstraints()— твой лучший друг. А логUIViewAlertForUnsatisfiableConstraints— это как крик души системы: "Чувак, блядь, я не могу всё это совместить, выбери что-то одно!". И там такие противоречия вылезают, что волосы дыбом встают.
В общем, сила в понимании, а не в тупом закидывании констрейнтов. Иначе получится как у того немого Герасима — стоит, мычит "Муму", а система его не понимает и в пизду швыряет.