【发布时间】:2020-01-12 16:40:17
【问题描述】:
如你所见,我有这个霓虹磁带的场景。在界面构建器中,我创建了 3 个 UIImageView,一个用于卡带背景,2 个用于左右主轴。这个想法是这些主轴根据状态(倒带,ffw或播放)向后或向前旋转。如果我只在 iPhone 8 上运行它,我可以做到这一点。但是,当我决定要在 iPhone 11 Pro 上运行它时,会发生以下情况:
无论我尝试编造何种奇怪的约束组合,我都无法让心轴在设备上遵循其正确的位置/尺寸。我将不得不花一些时间查找和阅读有关自动布局野兽的指南,但在爬上那座山之前,我将不胜感激!
编辑:
这是我目前所拥有的程序化版本,更具描述性:
override func viewDidLoad() {
super.viewDidLoad()
// Code to position/size cassette
let cassette = UIImageView(image: UIImage(named: "cassette"))
cassette.translatesAutoresizingMaskIntoConstraints = false
cassette.contentMode = .scaleAspectFit
view.addSubview(cassette)
view.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: cassette.bottomAnchor, constant: 44).isActive = true
view.safeAreaLayoutGuide.trailingAnchor.constraint(equalTo: cassette.trailingAnchor, constant: 20).isActive = true
cassette.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 20).isActive = true
cassette.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 44).isActive = true
// Code to position/size spindles
let spindleLeft = UIImageView(image: UIImage(named: "spindle"))
spindleLeft.translatesAutoresizingMaskIntoConstraints = false
spindleLeft.widthAnchor.constraint(equalToConstant: 74).isActive = true
spindleLeft.heightAnchor.constraint(equalToConstant: 74).isActive = true
cassette.addSubview(spindleLeft)
spindleLeft.centerXAnchor.constraint(equalTo: cassette.centerXAnchor, constant: -130.0).isActive = true
spindleLeft.centerYAnchor.constraint(equalTo: cassette.centerYAnchor, constant: -14.0).isActive = true
}
我目前正试图弄清楚是否有某种方法可以使用设备的 aspectRatio 以及我应该使用什么 UIImageView 内容模式(Aspect Fit、Aspect Fill)。也许我已经挖掘得太深了,有一个更简单的方法来处理这个我没有看到......
【问题讨论】:
-
@matt 卡带图像通过自动布局调整大小:Safe Area.bottom = Cassette.bottom + 44,Safe Area.trailing = Cassette.trailing + 20,cassette.leading,Safe Area.leading + 20,cassette.top = Safe Area.top + 44。所以,根据我目前的理解,图像应该根据这些约束调整大小,不是吗?视图的内容模式是“Aspect Fit”。换句话说,卡带应始终保持距离顶部/底部 44 点和距离尾随/领先 20 点。
-
方面适合。因此,您必须使主轴表现得像宽高比匹配图像的一部分。您必须模拟图像大小调整的数学运算。
-
@matt 我原以为 Aspect Fit 会将主轴保持为球体。无论如何,我想我应该用一些计算值改变某些约束的乘数以达到预期的效果?
-
@matt 我认为不可能在 Interface Builder 中实现这一点?即只能以编程方式实现?
-
您可以在 IB 中做的任何事情都可以通过编程方式进行。 IB 只是一个用于在 iOS 开发中做某些事情(不是全部)的 GUI,比如添加和定位子视图。我认为以编程方式进行操作会更容易(也更快)。
标签: ios autolayout