Изменения динамического вида (например, UILabel) с помощью autoLayout

Мне нужно создать два UILabels, размер которых должен динамически изменяться в зависимости от размера текста внутри UITableViewCell. Первый UILabel должен расти (на основе текста) влево и всегда выравниваться на 15 точек по правой границе. второй UILabel должен (также динамически расти влево) и быть выровнен на 7 точек вправо от первого UILabel.

... [label 2]<--7p-->[label 1]<--15p-->|right cell border

  1. Можно ли это сделать только на раскадровке (без кода)?
  2. Я определил горизонтальные ограничения в макете раскадровки и sizeToFit: в коде. и обнаружил, что горизонтальные ограничения были отменены. Пытался изменить кадры в viewDidLoad:, но не все были обновлены (выполнение селектора с задержкой 0 - обновить все метки во всех ячейках, но создало задержку в одну секунду.)

Пожалуйста, сообщите, спасибо Асаф


person Asaf    schedule 09.07.2014    source источник


Ответы (2)


Вопрос 1)

На самом деле вы можете сделать это в коде. но я думаю, что Interface Builder лучше в вашем случае.

Я думаю, вам не нужно [sizeToFit:] в коде.

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

Элементы UIControl, такие как UILabel, UIButton, имеют внутренний размер, потому что они имеют текстовое содержимое. поэтому вам не нужно устанавливать ограничение ширины.

но у вас есть две метки, и вы должны сообщить автомакету, какая метка важнее, когда возникает конфликт между метками. - бывший. если метки имеют длинный текст, текст какой метки отображается без сокращения (...).

Для этого установите приоритет сжатия (или сжатия) в интерфейсном конструкторе.

Вопрос 2)

[viewDidLoad:] не подходит для изменения геометрии. Представление UIViewController добавляется в иерархию представлений после [viewWillAppear:]

если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

person soulpark    schedule 09.07.2014

Вы можете добиться результата либо в коде, либо с помощью автомакета StoryBoard. Вот шаги для автоматического макета раскадровки:

1. Убедитесь, что у вас есть ячейка с двумя метками и без ограничений автоматического макета (удалите их, если они есть).

2. Добавьте ограничения к Label 1:

TwoLabelsCell_Label1_Constraints

3. Добавьте ограничения к Label 2:

TwoLabelsCell_Label2_Constraints

Результат:

TwoLabelsCell_Result

Примечания:

  • Манипуляции с макетом должны выполняться путем переопределения updateViewConstraints в вашем контроллере представления. Только не забудьте позвонить [super updateViewConstraints].

  • Не нужно иметь дело с методом sizeToFit: в вашем случае.

person Keenle    schedule 09.07.2014
comment
@Asaf Вы проверили решение? Это решает вашу проблему? - person Keenle; 16.07.2014