为什么UIView的internalContentSize总是返回(-1.0,-1.0)?

时间:2019-05-10 17:45:37

标签: ios swift uiview autolayout

具有正确的自动布局的UIView不能返回正确的固有内容大小。我得到(-1.0,-1.0),即使我在情节提要和应用运行时都能看到它的大小正确。

我尝试创建一个创建UIView(a)和UILabel的游乐场。 我将标签添加为(a)的子视图,并设置左,右,上,下约束。 我还设置了一些文本,并验证了我的标签具有正确的固有尺寸(确实如此)。 我的(a)视图返回的固有内容大小为(-1.0,-1.0)。

我还尝试过使用情节提要创建一个新项目。 我在视图中添加了一个UIView(a)并将其居中(X和Y)。 我在我的(a)视图中添加了UILabel,并限制了左,右,上,下。 我可以看到(a)视图大小正确。当我运行该应用程序时,我看到它的大小仍然合适。 我的(a)视图返回的固有内容大小为(-1.0,-1.0)。

考虑到UIView会根据其固有的内容大小(即子视图和关联的约束)进行布局,因此我发现这非常奇怪。

假设我对(a)视图边缘的标签约束全部为0,那么我希望(a)视图的固有内容大小等于标签框架的固有内容大小(基于标签的内在尺寸,但这有点不合理。

我真的不理解视图如何将其框架设置为其子元素的固有大小,而又没有固有内容大小。

((a)视图的框架返回正确的大小,但这并不能真正回答我的问题。而且-这对我的特定情况没有帮助,但这不在此问题的范围内。)< / p>

1 个答案:

答案 0 :(得分:1)

  

考虑到UIView会根据其固有的内容大小(即子视图和相关的约束)进行布局,因此我发现这非常奇怪。

这仅仅是对“内在内容大小”的误解。普通的UIView没有(有意义的)内部内容大小。

内部内容大小是某些接口对象(例如UILabel和UIButton)实现的属性,因此您不必为其设置高度和宽度约束。这些是特殊的接口对象,包含 text (和/或(如果是按钮,则是图像)),并且可以调整自身大小以适合该对象。

您的UIView不是那样的,并且基本上根本没有实现固有的内容大小。可以编写一个实现内部内容大小的UIView子类,其行为类似于UILabel或UIButton。但您尚未这样做。


您在评论中说:

  

如果我有一个只具有Center X和Center Y约束的UIView,并且给出了一些内容,我想知道自动布局操作后的大小

很好,但这不是它的固有内容大小。这是它的 size 。如果您在视图控制器中,请实现AVRoutePickerView *routePickerView = [AVRoutePickerView new]; routePickerView.backgroundColor = [UIColor clearColor]; routePickerView.activeTintColor = [UIColor blueColor]; routePickerView.tintColor = [UIColor whiteColor]; //I put it in a StackView, incidentally [self.bottomButtonStack insertArrangedSubview:routePickerView atIndex: 3]; [routePickerView.layer setFrame:CGRectMake(80,80,80,80)]; [routePickerView.heightAnchor constraintEqualToConstant:52].active = true; [routePickerView.widthAnchor constraintEqualToConstant:52].active = true; 并查看此视图​​的didLayoutSubviews。那就是你要的大小。

  

我很好奇如何计算

啊,好的。但是那您应该已经问过了。答案是:致电systemLayoutSizeFittingSize