UIView 和内在内容大小

Posted

技术标签:

【中文标题】UIView 和内在内容大小【英文标题】:UIView and intrinsicContentSize 【发布时间】:2013-01-25 18:33:32 【问题描述】:

UIView 是否创建intrinsicContentSize

我创建了一个 UIView 内容视图。我不给它限制大小:

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

我创建另一个 UIView subview01。我给它约束大小并将其添加到我的 contentView:

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 将如何调整大小以显示其所有文本?

【问题讨论】:

【参考方案1】:

不,UIView 没有intrinsicContentSize。按钮和标签可以,因为系统很容易根据其中的字符串和/或图像计算该大小。对于一个 UIView,你通常需要 4 个约束来完整描述它的位置和大小。

【讨论】:

或者你可以继承UIView并覆盖intrinsicContentSize方法。 但 intrinsicContentSize 是一个 UIView 方法,您可以重写 这是不正确的。在某些情况下,您可能需要覆盖 UIView 的 intrinsicContentSize。例如,如果一个视图包含一个文本视图,您必须通过覆盖该方法来告诉视图的大小。 这不再准确。 ios 14 + Swift 5 上的可视化调试器清楚地显示了一个 UIImageView,它试图根据它所显示的图像的内容大小来设置它的高度和宽度。【参考方案2】:

虽然不是一个完美的解决方案,但我确实找到了一种模仿 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]];

【讨论】:

以上是关于UIView 和内在内容大小的主要内容,如果未能解决你的问题,请参考以下文章

内在内容大小与对齐矩形

iOS:如果我将 UILabel 添加到 UIView,视图是不是具有标签的固有内容大小?

自动布局内在内容大小以填满屏幕

防止 UIStackView 中的内在内容大小

NSTextView 的内在内容大小

SVG 内容的内在大小属性