Я пытаюсь создать динамический макет, используя новый API-интерфейс autolayout в iOS 6.0. Макет, который я пытаюсь построить, имеет 2 кнопки с меткой между ними, как показано на рисунке ниже:
Я бы хотел, чтобы представление контейнера, показанное серым цветом, увеличивалось или уменьшалось в размере в зависимости от количества текста в метке.
До сих пор мне удавалось заставить макет работать точно так, как описано, с одной небольшой проблемой, которую я не смог решить. Проблема, с которой я сталкиваюсь, заключается в том, что внутренняя высота метки всегда рассчитывается с использованием исходной ширины метки (например, той, что установлена в построителе интерфейса), а не ширины метки, которая устанавливается из ограничений, которые у меня есть на нем.
Ограничения, которые у меня есть для представлений, следующие:
- H:|-[левая кнопка]-[метка]-[правая кнопка]-|
- Обе кнопки центрированы по вертикали
- V: |-[метка]-|
- приоритет содержимого кнопок выше, чем метка
- Сопротивление сжатию этикетки выше, чем у контейнера вида
Все эти ограничения вместе создают желаемый макет.
Однако:
- Если ширина метки в построителе интерфейса (литеральный размер в построителе интерфейса) меньше ширины представления во время выполнения, то высота контейнера слишком велика.
Чтобы прояснить это, представление IB приведенного выше макета было следующим (обратите внимание, что оно намного уже):
- Если ширина метки в построителе интерфейса (литеральный размер в построителе интерфейса) больше, чем ширина представления во время выполнения, то высота контейнера слишком мала, и строки текста обрезаются.
Похоже, что происходит то, что, хотя ограничений на ширину метки нет, метка, похоже, вычисляет свою высоту (и, следовательно, вычисляемую автомакетом высоту контейнера) на основе исходной ширины метки при ее создании. Однако что так странно, так это то, что текст имеет правильную ширину и высоту, но сама этикетка имеет рамку, которая слишком велика или мала.
Я предполагаю, что это связано с порядком, в котором происходят вещи, и попытался вызвать updateConstraintsIfNeeded в методе layoutSubview containerViews, однако это, похоже, ничего не делает.
Любые предложения будут ценны.