【发布时间】:2021-07-01 06:40:02
【问题描述】:
我正在以编程方式练习自动布局。我想在控制器中放置一个 UIView 居中,其宽度在纵向模式下为 4/5,但是当它进入横向模式时,我需要高度为超级视图高度的 4/5,而不是宽度.
类似的东西-
因此,我正在停用然后根据方向激活所需的约束,但是当我更改旋转时,它会给我带来冲突,就好像它没有停用那些我指定停用的约束一样。这是我的完整代码。由于它是独立于情节提要的,因此可以将视图控制器类分配给视图控制器并查看效果。
class MyViewController: UIViewController {
var widthSizeClass = UIUserInterfaceSizeClass.unspecified
var centeredView : UIView = {
let view = UIView()
view.backgroundColor = UIColor.systemGreen
return view
}()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.view.addSubview(centeredView)
centeredView.translatesAutoresizingMaskIntoConstraints = false
}
override func viewWillLayoutSubviews(){
super.viewWillLayoutSubviews()
widthSizeClass = self.traitCollection.horizontalSizeClass
addConstrainsToCenterView()
}
func addConstrainsToCenterView() {
centeredView.centerXAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor).isActive = true
centeredView.centerYAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerYAnchor).isActive = true
let compactWidthAnchor = centeredView.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 4/5)
let compactHeightAnchor = centeredView.heightAnchor.constraint(equalTo: centeredView.widthAnchor)
let regularHeightAnchor = centeredView.heightAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.heightAnchor, multiplier: 4/5)
let regularWidthAnchor = centeredView.widthAnchor.constraint(equalTo: centeredView.heightAnchor)
if widthSizeClass == .compact{
NSLayoutConstraint.deactivate([regularWidthAnchor, regularHeightAnchor])
NSLayoutConstraint.activate([compactWidthAnchor, compactHeightAnchor])
}
else{
NSLayoutConstraint.deactivate([compactWidthAnchor, compactHeightAnchor])
NSLayoutConstraint.activate([regularWidthAnchor, regularHeightAnchor])
}
}
}
谁能帮我找出我的缺陷。
【问题讨论】:
-
在大多数情况下,这就是我成功做到这一点的方式。 (我实际上创建了数组而不是明确命名的约束。我不认为这是一个问题。)但是,如果使用大小类,我唯一会跳出来的事情。它们与不同的覆盖更紧密相关 - 如果您使用的是 iPad,除非将 iPad 放入分屏,否则它们不会改变。一个建议,一个可能需要小的重写?检查
viewWillLayoutSubviews(或更好的viewDidLayoutSubviews)上的屏幕宽度/高度,并像您一样激活/停用。 -
尺码等级不是这里的问题。如果我只是在 iPhone 12 pro max 上运行它,它应该可以正常工作而不会给我带来任何冲突。但是,这给了我冲突。您还可以通过将整个代码复制到视图控制器中来检查,因为它是视图控制器的整个代码。
-
发布一些适合我的代码。也许会有所帮助?
标签: ios autolayout nslayoutconstraint programmatically