UIView и встроенный ContentSize

Создает ли UIView intrinsicContentSize?

Я создаю UIView contentView. Я не даю ему ограничений по размеру:

UIView *contentView = [UIView new];
[contentView setTranslatesAutoresizingMaskIntoConstraints:NO];
contentView.backgroundColor = [UIColor orangeColor];

Я создаю еще один UIView subview01. Я даю ему размер ограничений и добавляю его в свой контентView:

UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[imageView setTranslatesAutoresizingMaskIntoConstraints:NO];
imageView.userInteractionEnabled = TRUE;
imageView.backgroundColor = [UIColor clearColor];

[imageView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[imageView(WIDTH)]"
                                                                  options:0
                                                                  metrics:@{@"WIDTH" : [NSNumber numberWithFloat:imageSize.width]}
                                                                    views:NSDictionaryOfVariableBindings(imageView)]];

[imageView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[imageView(HEIGHT)]"
                                                                  options:0
                                                                  metrics:@{@"HEIGHT" : [NSNumber numberWithFloat:imageSize.height]}
                                                                    views:NSDictionaryOfVariableBindings(imageView)]];


[contentView addSubview:imageView];

contentView не увеличивает размер. Я думал, что intrinsicContentSize должен рассчитать размер, необходимый для отображения всех подвидов и изменения размера? Например, как UILabel изменит размер, чтобы показать весь его текст?


person Padin215    schedule 25.01.2013    source источник


Ответы (2)


Нет, UIView не имеет встроенного ContentSize. Кнопки и метки подходят, так как системе легко вычислить этот размер на основе строки или изображения в них. Для UIView обычно требуется 4 ограничения, чтобы полностью описать его положение и размер.

person rdelmar    schedule 25.01.2013
comment
Или вы можете подклассировать метод UIView и переопределить метод intrinsicContentSize. - person Rudolf Adamkovič; 29.03.2013
comment
но innerContentSize - это метод UIView, который вы бы переопределили - person Max MacLeod; 07.08.2013
comment
Это неправильно. В некоторых случаях вам может потребоваться переопределить intrinsicContentSize UIView. Например, если представление содержит текстовое представление, вы должны указать размер представления, переопределив этот метод. - person ozgur; 13.12.2015
comment
Это уже не точно. Визуальный отладчик на iOS 14 + Swift 5 ясно показывает, что UIImageView пытается установить свою высоту и ширину в зависимости от размера содержимого отображаемого изображения. - person Zack; 28.11.2020

Хотя это и не идеальное решение, я нашел способ имитировать intrinsicContentSize.

Я устанавливаю представление контейнера NSLayoutAttributeRight на самое правое вспомогательное представление NSLayoutAttributeRight и делаю то же самое для NSLayoutAttributeBottom на самое нижнее вспомогательное представление NSLayoutAttributeBottom.

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self
                                                          attribute:NSLayoutAttributeRight
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:rightSubView
                                                          attribute:NSLayoutAttributeRight
                                                         multiplier:1 constant:0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self
                                                          attribute:NSLayoutAttributeBottom
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:bottumSubView
                                                          attribute:NSLayoutAttributeBottom
                                                         multiplier:1 constant:0]];
person Padin215    schedule 07.07.2015