我目前有一个应用程序,可以通过编程设置约束。在横向模式下启动应用程序时,会出现问题。当应用以横向模式启动时,UIViews宽度和高度的大小会超出屏幕。但是,当应用程序以纵向模式启动时,该应用程序很好,并且在旋转时可以正确保持其约束。这似乎只是横向打开应用程序时的问题。这是我的代码和屏幕截图:
func setUpGameBoard(){
let width = UIScreen.main.bounds.width
let gameBoard = Gameboard(frame: .zero, mainVC: self)
self.view.addSubview(gameBoard)
gameBoard.translatesAutoresizingMaskIntoConstraints = false
gameBoard.widthAnchor.constraint(equalToConstant: width).isActive = true
gameBoard.heightAnchor.constraint(equalToConstant: width).isActive = true
gameBoard.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
gameBoard.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}
这里是直立启动时,旋转时没有问题。
答案 0 :(得分:1)
基本上,在横向屏幕的宽度要大得多。 发生这种情况是因为在横向中,宽度(您在纵向中使用的宽度)变成了高度。
这是Apple理解他们所谓的 自动布局 的一种非常有用的资源:Auto Layout Guide
您的问题与 尺寸类 有关,它们是高级的自动版式系统,您可以在此处Size Classes specific Auto Layout
了解更多信息这是Ray Wenderlich撰写的有关“自动布局”的非常不错的教程:Auto Layout Tutorial
有几种方法可以实现您的目标:
1。 。如果您可以从情节提要中设置约束,则可以使用Size Class轻松根据纵向/横向设置不同的约束,您会发现很多教程和资源,但我链接了您this one。它是意大利语的,但我向您保证这是有关尺寸等级的完整资料,并且使用Google翻译,这很容易理解。
2。 。您可以使用此代码检查自己的模式:
if UIDevice.current.orientation == UIDeviceOrientation.landscapeLeft {
} else if UIDevice.current.orientation == UIDeviceOrientation.landscapeRight {
} else if UIDevice.current.orientation == UIDeviceOrientation.portrait {
} else if UIDevice.current.orientation == UIDeviceOrientation.portraitUpsideDown {
}
3。 。您可以“手动”检查宽度:
ES。
// I used a random value, but it should be around the width value in portrait
if(width > 389){
width = 389
}
4。 以编程方式使用 大小类 也是一种解决方案,但我永远不会使用它。但是,这是一个很好的教程,介绍了如何以编程方式使用它们:Using Trait Collections for Auto Layout and Size Classes
答案 1 :(得分:1)
这里的问题是,当您以横向模式启动应用程序时,屏幕的宽度实际上是纵向模式的高度。因此,您可以添加简单的检查以查看发射方向是横向还是纵向,并相应地更新约束:
if UIDevice.current.orientation.isLandscape {
let height = self.view.frame.height
gameBoard.widthAnchor.constraint(equalToConstant: height).isActive = true
gameBoard.heightAnchor.constraint(equalToConstant: height).isActive = true
} else if UIDevice.current.orientation.isPortrait {
let width = self.view.frame.width
gameBoard.widthAnchor.constraint(equalToConstant: width).isActive = true
gameBoard.heightAnchor.constraint(equalToConstant: width).isActive = true
}