设备更改时 UIView 不调整宽度

UIView is not resizing width when device has changed

我的 Storyboard 中有一个 UIView。 Leading和Trailing都是16,元素的宽度不固定。

我正在将 UILabel 附加到此 UIView (-container),当新的和现有的 UILabel 超过容器的宽度时,它将移动到下一个 "row"。 "containerWidth" (UIView.frame.size.width) 是 382.

**// If current X + label width will be greater than container view width
// .. move to next row**
if (currentOriginX + labelHashtag.frame.width > containerWidth) {
      currentOriginX = 0
      currentOriginY += tagHeight + tagSpacingY
      }

它适用于 iPhone XSM:

但是当我 运行 我的代码在 iPhone 8 上时,容器宽度仍然是 382 并且 UILabels 出现在我的屏幕之外:

为什么我的 UIView 的大小总是一样的?为什么在我使用约束时没有自动调整大小,具体取决于设备?

您从哪里添加标签?如果您从 viewDidLoad() 方法添加它们,那么这是预期的结果,因为此时您的容器视图将具有与情节提要中完全相同的宽度,然后它将根据设备屏幕尺寸调整大小。您可以使用 viewDidAppear(_:) 方法来布置标签,但您必须小心,因为从屏幕外观和标签在屏幕上呈现的角度来看可能会有一小段延迟。

不要使用viewDidLayoutSubviews()创建和添加标签,因为该方法会被多次调用。但是,您可以使用 viewDidLayoutSubviews() 重新计算标签的位置(实际上,我会推荐这种方法)。

所以我的建议是:

  1. viewDidLoad() 方法中创建标签
  2. 注意引用你的标签(很可能是一个数组)
  3. viewDidLayoutSubviews()中计算标签的位置。