Swift: некорректные ограничения при запуске устройства в альбомной ориентации - PullRequest
0 голосов
/ 03 февраля 2019

В настоящее время у меня есть приложение, в котором я программно устанавливаю ограничения.Проблема возникает, когда приложение запускается в ландшафтном режиме.Когда приложение запускается в ландшафтном режиме, размер ширины и высоты 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 голосов
/ 03 февраля 2019

Проблема в том, что при запуске приложения в альбомной ориентации ширина экрана фактически равна высоте портретного режима.Таким образом, вы можете добавить простую проверку, чтобы увидеть, является ли ориентация запуска либо альбомной, либо книжной, и соответствующим образом обновить ограничения:

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
}
0 голосов
/ 03 февраля 2019

В основном, в альбомной ориентации ширина экрана намного больше.Это происходит потому, что в альбомной ориентации ширина (которую вы используете в портретной ориентации) становится высотой.

Это действительно хороший и полезный ресурс Apple для понимания того, что они называют Авторазметка: Руководство по автоматической компоновке

Ваша проблема связана с классами размеров , и они являются усовершенствованной автоматической компоновкойСистема, вы можете узнать больше здесь

Есть несколько способов достижения вашей цели:

1. Если вы можете установить ограничения из раскадровки, это намного прощечтобы установить различные ограничения на основе портрета / пейзажа с помощью Size Class, вы найдете много уроков и ресурсов, но я свяжу вас с этим .Это по-итальянски, но я заверяю вас, что это полный размер классов, и с Google Translate это будет легко понять.

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. Использование Классов размера программным способом также является решением, но я бы никогда не использовал его.Тем не менее, это хороший учебник о том, как использовать их программно: Использование коллекций признаков для классов Auto Layout и Size

...