iOS autolayout, игнорируя ограничение «конечного пробела», используя вместо этого ширину / размер содержимого?

У меня есть UILabel ( субтитр ), что я хочу иметь статическое происхождение X, но распространяюсь на край его ближайшего соседа. Существует кнопка («Ссылка на посещение»), которая необязательно удаляется из супервизора во время выполнения, если это не требуется. Ограничение с метки на кнопку имеет приоритет 1000, а ограничение с метки на контейнер супервизора имеет приоритет 250:

введите описание изображения здесь

Тем не менее, когда я запускаю приложение, удаляя кнопку (через .removeFromSuperview() в методе viewDidLoad ), через отладку просмотра я вижу, что размер содержимого устанавливает ширину метки, принимая приоритет над установленным ограничением.

Я ожидаю, что ярлык будет расширяться до края представления, но, как вы можете видеть, ограничение выделено серым цветом: вместо этого я предполагаю, что вместо ограничения (content size) выполняется ограничение:

введите описание изображения здесь

Ограничение (ограничение (content size) имеет более высокий приоритет, чем мое ограничение Trailing Space to: Superview ? И как я могу его изменить, поскольку это не ограничение, которое я даже определил?

3 Solutions collect form web for “iOS autolayout, игнорируя ограничение «конечного пробела», используя вместо этого ширину / размер содержимого?”

Когда вы удаляете кнопку из иерархии представления, это также удаляет любые ограничения, связанные с кнопкой. Итак, все, что осталось, – это конечное ограничение для супервизора с приоритетом 250.

Метка имеет внутреннюю ширину, основанную на ее содержании. Это означает, что приоритеты его горизонтального охвата и ограничения сопротивления сжатию вступают в игру. Приоритет его содержания составляет 251.

Это означает, что для системы автоматического макета важнее, чтобы ширина представления была не больше, чем необходимо, чем для того, чтобы сохранить ее задний край в 8 точках от задней кромки супервизора.

Вероятно, вы должны увеличить приоритет конечного ограничения. Вы хотите, чтобы это было меньше, чем привязка к кнопке, так что в случае, когда кнопка присутствует, она не конфликтует. Вы также хотите, чтобы это было меньше, чем приоритет устойчивости к сжатию кнопки, так что кнопка не сжимается, чтобы метка имела 8 точек от супервизора. Но, кроме этого, вы хотите, чтобы он был как можно выше. (В гипотетическом случае, когда вы просто избавились от возможности наличия кнопки, вы обычно делали бы это обязательное ограничение, верно? Итак, оно должно быть как можно ближе к требуемому, не вызывая нежелательных побочных эффектов.)

Если вы планируете развертывание в iOS 9.0 или новее, вам следует использовать UIStackView для этого макета. Он позаботится о некоторых вещах для вас, таких как добавление или удаление соответствующих ограничений, когда кнопка скрыта или показана.

Ограничение (content size) , автоматически устанавливаемое системой во время выполнения, похоже, имеет приоритет где-то между 250 и 750. Когда я использую 250 или 251 для ограничения Trailing Space , это не работает.

Однако, назойливая приоритет моего ограничения на Trailing Space до высокого приоритета с индексом Xcode 750 , позволяет ему иметь приоритет. Поэтому значения по умолчанию для ширины UILabel похоже, падают «где-то посередине».

Автолайон, ты глупый.

Со второго скриншота, похоже, что все работает так, как предполагается.

Две вещи, которые я хотел бы упомянуть:

  1. Всегда старайтесь настроить макет, чтобы у вас было как можно меньше ограничений. Каждое ограничение добавляет сложности.
  2. Да, размер содержимого метки действительно имеет более высокий приоритет. Вот почему ярлык не изменен до самого правого края, что хорошо. То, что вы видите, является внутренним размером ярлыка, что означает, что UIKit знает, насколько большой ярлык должен быть нарисован, в зависимости от шрифта, текста и т. Д.

Чтобы сделать этот макет более надежным, я бы изменил пространство трейлинга на ярлыке так, чтобы он имел приоритет 1000 но был >= 0 .

Таким образом, макет будет действителен с помощью кнопки «Посещение ссылки» или без нее, а размер содержимого ярлыка (его внутренний размер) изменит его размер до любой длины, которая должна быть, но не более, чем правый край его супервизора.

Надеюсь это поможет!

ОБНОВЛЕНИЕ: Написал быстрый ответ о том, почему этот размер содержимого появляется и почему вы должны использовать его в своих интересах.

  • Недопустимый пакет. Пакет в '.app' не содержит исполняемого пакета
  • Почему Xcode 7 показывает около 12% покрытия кода, когда нет единичных тестов вообще?
  • Как создать графическое приложение для iphone?
  • Пожалуйста, добавьте kCFBundleIdentifierKey в словарь параметров при установке приложения.
  • '? не конвертируется в '' -> swift2
  • Кнопка Xitode UITest Record отключена
  • UIImageView с iOS 7 не отображается
  • Обновление XCode 5 разбивает раскладку сцен
  • Приложение Phonegap iOS: измените внешний вид клавиатуры на UIKeyboardAppearanceAlert (снова)
  • Обработка повторяющихся записей в Core Data
  • Перекрывающаяся таблица просмотра прокрутки tableView за ней
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.