Swift:在横向启动设备时约束不正确

时间:2019-02-03 18:34:36

标签: swift xcode uiview constraints

我目前有一个应用程序,可以通过编程设置约束。在横向模式下启动应用程序时,会出现问题。当应用以横向模式启动时,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

        }

When app started in landscape

这里是直立启动时,旋转时没有问题。

when app started in portrait

2 个答案:

答案 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
}