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 和内在内容大小的主要内容,如果未能解决你的问题,请参考以下文章