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 .

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

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

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

  • Что такое файл xcscheme? В чем цель?
  • Шаблоны проектов расширения не отображаются в Xcode 6
  • Невозможно запустить приложение в Simulator: Xcode beta 6 iOS 8
  • Как добавить предопределенные значения в plist?
  • Ошибки, отброшенные отсюда, не обрабатываются для {} catch в Swift 2.0
  • Как заменить NSUncaughtExceptionHandler на определение в навигаторе точки останова?
  • Xcode 5 & Asset Catalog: Как ссылаться на LaunchImage?
  • Ошибка архива ZXingObjC iOS: «ZXingObjC / ZXingObjC.h» не найден. Редактировать
  • Недопустимый тип аргумента void для унарного выражения
  • Поиск массива на основе текста поиска с использованием Swift
  • Вариант для динамических прототипов, отсутствующих в указателе атрибутов
  • iOS: использование @private для скрытия свойств
  • Interesting Posts

    Как установить фоновое изображение в быстром?

    Как получить консольные журналы с устройств iOS 8 с помощью Windows PC

    UIScrollView внутри UIScrollView – игнорировать вид прокрутки, касающийся при просмотре текста?

    UISwitch вкл / выкл не работает iOS10

    HTML5 Web SQL Transactions пропустили без ошибок при срабатывании сенсорного экрана в IOS

    Прочитайте данные из firebase и заполните TableViewCell

    Threading, приоритеты и отказ

    SFSafariViewController теряет состояние при возврате в приложение

    iOS: Strip <img …> из NSString (строка html)

    В представлении содержимого UIScrollView игнорируется ограничение ширины ширины на основной вид Xcode 6

    Загрузка изображения с помощью приложения IOS в размер файла сервера слишком велика

    Cocoapods, импортирующие внешнюю структуру

    Изменение цвета панели навигации в Swift

    Настроить панель навигации, добавив две метки вместо названия в Swift

    UICollectionView не вызывает методы делегирования

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.