旋转模拟时,内容不会调整大小。 Xcode 11

Posted

技术标签:

【中文标题】旋转模拟时,内容不会调整大小。 Xcode 11【英文标题】:When rotating simulation, content does not resize. Xcode 11 【发布时间】:2021-03-16 19:51:40 【问题描述】:

当我在 Xcode 11 中运行我的应用程序模拟时,它运行良好(纵向或横向)。但是当我旋转时,它不会调整到我为该方向设置的适当约束。

Sim in portrait

Sim in Landscape after rotation

Image of constraints

如果我停止应用在后台运行并路由模拟然后打开它,那么它可以正常工作。

如何在设备旋转时调整内容的大小?

【问题讨论】:

我在故事板中使用了约束。我将更新帖子以包含我的约束图像 【参考方案1】:

我认为您的问题在于您的 heightwidth 约束。

尝试删除MCC.width = 812MCC.height = 376。您为标签设置的其余约束将使其保持在 Video layer 视图的中心。

还可以尝试在您的 Video Layer 视图上删除 height = 2000,因为您设置的剩余约束应该使其绑定到其视图的边缘。

明确设置高度和宽度约束的问题是,当您旋转设备时,设备的高度和宽度会发生变化。例如,当您运行您的应用程序(从纵向开始)时,您在 iphone 11 上的最大高度为 896,宽度为 414 点。但是当您将其旋转为横向时,这些值会交换,因此您现在的最大高度为 414pt 和宽度为 896 点。

纵向运行您的应用程序,旋转后查看Debug -- View Debugging -- Capture View Hierarchy(在 Xcode 菜单而非模拟器菜单中)。我想你会发现你的Video layer 超出了superView

您希望您的Video layer 内容覆盖整个屏幕吗?如果是这样,在属性检查器中将Content Mode 设置为Aspect Fill,这将剪辑一些内容。如果您希望所有内容都可见,请将其设置为 Aspect Fit

【讨论】:

我已经删除了你告诉我的限制(除了高度 = 2000,因为它说它是必需的。我还尝试了视频层的宽高比填充和宽高比,但它仍然不起作用。 好的,所以您希望滚动视图能够滚动到最大 2000?同样在横向中,您是否希望视频层填充屏幕或保持与纵向相同的尺寸(在这种情况下,您需要滚动以显示其余部分)让我知道您想要的布局是什么,我会为您更新答案。 我希望滚动视图保持为 2000,并且我希望视频层占据全屏(无论是纵向还是横向)谢谢!【参考方案2】:

您将不得不使用约束或自动布局来固定子视图(文本、图像、旋转到父视图后未正确显示的那些子视图(例如 UIViewController 的主要 UIView )。

有很多地方可以这样做。这些是一些例子:

Interface Builder 中:您需要使用

    自动布局来定义每个子视图可以如何拉伸,以及子视图的锚定位置。使用以下方法来实现此目的: 使用约束进行固定和锚定:

如何添加

如何检查

代码中:可以使用

    将视图固定到超级视图的约束。
    titleLabel.translatesAutoresizingMaskIntoConstraints = false
    titleLabel.leadingAnchor.constraint(equalTo: closeButton.trailingAnchor, constant: 30).isActive = true
    titleLabel.topAnchor.constraint(equalTo: closeButton.topAnchor).isActive = true
    titleLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -15).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 50).isActive = true
    使用框架和尺寸:
titleLabel.frame = mySuperView.frame

对于代码布局/约束,如果您要锚定视图,我发现最好在将子视图添加到父视图时添加它(在 viewDidLoadinit... 中),但如果您正在使用尺寸(widthAnchorheightAnchor),或者如果您使用框架和大小,布局更新方法(layoutSubviewsdidLayoutSubviewstransition...,...)是最好的地方,因为它们会在旋转变化。

注意:我使用 xcode 11.7 制作屏幕截图,xcode 12 更改了一些图标,因此它们看起来会略有不同。但是,功能是一样的。

【讨论】:

感谢您的回复,感谢您的详细回答。不幸的是,它仍然不起作用。我不知道发生了什么事,这很令人沮丧 @JonathanSoliman 2000 高度的约束是什么?有一个 2000 值的约束很奇怪吗?如果你删除它,它会解决问题吗? 我有一个高度为 2000 的滚动视图。我还希望视频层位于滚动视图的顶部,占据整个屏幕,并且在您滚动时。视频将随着滚动视图向上移动。

以上是关于旋转模拟时,内容不会调整大小。 Xcode 11的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局时标签不会调整大小,情节提要中的约束

XCode:调整图像大小使用纵横比并向下移动图像下方的元素

添加子视图时,如果应用程序处于横向模式,则视图不会调整大小

设备旋转时如何自动调整 UICollectionView 的大小?

Xcode 自动布局和旋转

CollectionView 标头不会在自动旋转时调整大小