是否可以在运行时使用 AutoLayout 根据屏幕高度或屏幕宽度中的最大值来制作 1:1 的纵横比?

Posted

技术标签:

【中文标题】是否可以在运行时使用 AutoLayout 根据屏幕高度或屏幕宽度中的最大值来制作 1:1 的纵横比?【英文标题】:Is it possible to use AutoLayout to make an aspect ratio of 1:1 based on the largest of either Screen Height or Screen width, at runtime? 【发布时间】:2019-08-27 04:53:37 【问题描述】:

我对特征和约束感到非常困惑。

我的视图需要以 1:1 的比例显示,并且它的大小需要取决于屏幕宽度或屏幕高度中的较大者、运行时以及所有设备方向。

最重要的是,我需要将它从屏幕中心向下移动,移动量是在运行时根据方向和 iPhone 与 iPad 计算得出的。

这是否可能,或者最好在代码中完成所有这些并从此视图中删除所有 AutoLayout 约束?

我读过这个:Aspect ratio constraint relative to the screen width

还有这个:https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/Size-ClassSpecificLayout.html

但我似乎仍然无法让它做我想做的事。

有人可以澄清我需要做什么吗?

谢谢

【问题讨论】:

将高度设置为等于宽度,并将高度约束的常量更改为layoutSubviews()中的最小值(高度,宽度)。 这是个好主意,但您的意思是 max(height, width) 因为它需要调整为两者中较大的那个吗? 那么视图不会在屏幕之外吗? 部分是的,但这就是我想要的。 您应该创建一次约束,然后在需要时更改该约束的常量。 【参考方案1】:

您需要至少将这 2 个约束添加到情节提要中的 UIView。 第一个将用于纵横比,第二个将用于 UIView 的宽度,具有一个常数值。 您将在名为 widthConstraint 的 UIViewController 类中添加第二个约束的出口 在委托函数 ViewWillAppear() 中,您将添加计算最大边的代码,并将该值添加到约束常量。

UIView.animate(withDuration: 0.0) 
        let largestOfScreenSide = max(UIScreen.main.bounds.width, UIScreen.main.bounds.height)
        self.widthConstraint.constant = largestOfScreenSide
        self.view.layoutIfNeeded()
    

【讨论】:

以上是关于是否可以在运行时使用 AutoLayout 根据屏幕高度或屏幕宽度中的最大值来制作 1:1 的纵横比?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Autolayout 在 UITableView 中异步加载图像

window.navigator.standalone 检测iOS WebApp是否运行在全屏模式

屏幕适配/autoLayout autoresizingMask

代码适配(Autolayout)

storyBoard方式ScrollView的AutoLayout

Android中Activity运行时屏幕方向与显示方式详解