UILabel sizeToFit и ограничения

172
23

Есть ли какой-либо простой способ, который может помочь мне динамически изменять положение зависимых представлений, используя их размер содержимого?


Я хочу показать несколько просмотров в столбце, в которых все имеют различный контент. И я хочу, чтобы они были размещены один за другим (я создал макет, используя ограничения, которые выглядят так)


initial layout


Но всякий раз, когда я изменяю содержимое меток и вызываю sizeToFit, система, похоже, игнорирует макет.


after size to fit call


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

спросил(а) 2021-01-25T14:47:16+03:00 5 месяцев назад
1
Решение
287

-sizeToFit не следует вызывать, если вы используете автоматическую компоновку. Эта часть "старой" системы.


Похоже, что IB ввел явные высоты в ваши ограничения (вертикальные столбцы рядом с метками указывают на это). Попробуйте выбрать ярлыки и нажать Cmd + =, чтобы очистить их.


Для многострочных этикеток вам также необходимо будет сделать следующее в контроллере просмотра, чтобы все было корректно работать при повороте/изменении размера представления:

- (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label
{
label.preferredMaxLayoutWidth =
[label alignmentRectForFrame:label.frame].size.width;
}

- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];

[self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label1];
[self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label2];
[self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label3];

[self.view layoutSubviews];
}


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

ответил(а) 2021-01-25T14:47:16+03:00 5 месяцев назад
63

Если вы все еще хотите использовать автоматическое ограничение компоновки для своей метки. Это решение:


[self.lblBadgeValue sizeToFit];
self.constraintWidthBadgeLabel.constant = self.lblBadgeValue.frame.size.width;
[self.lblBadgeValue needsUpdateConstraints];
[self.lblBadgeValue layoutIfNeeded];

    Объясните больше:
    sizeToFit → сделать высоту ярлыка, ширину с
    его содержание.
    Итак, во время выполнения вам нужно обновить высоту ограничения,
    или ширину для метки
    После этого вам нужно сказать для компилятора
    что требуется ограничение на обновление.
    И в итоге вам нужно позвонить
    макет, если есть изменения в ограничении.

ответил(а) 2021-01-25T14:47:16+03:00 5 месяцев назад
-4

Это тоже работает.
https://github.com/jszumski/auto-layout-table-cells/blob/master/DynamicCellHeights/JSLabel.m


@interface JSLabel : UILabel

@end

@implementation JSLabel

- (id)init {
self = [super init];

// required to prevent Auto Layout from compressing the label (by 1 point usually) for certain constraint solutions
[self setContentCompressionResistancePriority:UILayoutPriorityRequired
forAxis:UILayoutConstraintAxisVertical];

return self;
}

- (void)layoutSubviews {
[super layoutSubviews];

self.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds);

[super layoutSubviews];
}

@end

ответил(а) 2021-01-25T14:47:16+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема