UIView and intrinsicContentSize

5

UIView会创建intrinsicContentSize吗?

我创建了一个名为contentView的UIView。我没有给它约束尺寸:

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

我创建了另一个名为 subview01 的 UIView 子视图。我给它加上约束大小并将其添加到我的 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将调整大小以显示其所有文本一样。

2个回答

9

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


9
你可以创建 UIView 的子类并重写 intrinsicContentSize 方法。 - Rudolf Adamkovič
但是intrinsicContentSize是一个UIView方法,您可以重写它。 - Max MacLeod
1
这不是正确的。有些情况下,您可能需要覆盖UIView的intrinsicContentSize。例如,如果一个视图包含一个文本视图,您必须通过覆盖该方法来告诉视图应该是什么大小。 - Ozgur Vatansever
这已经不准确了。iOS 14 + Swift 5上的可视化调试器清楚地显示一个UIImageView试图根据其显示的图像的内容大小设置其高度和宽度。 - Zack

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接