Swift. Почему UIScreen.main.bounds ведет себя по-разному на разных устройствах?

Я пытаюсь создать игру для IOS, используя SpriteKit. Моя проблема в том, что разные устройства выводят разные вещи. Это код, который я пытаюсь:

var testPath = CGRect(
   x: 0,
   y: 0,
   width: UIScreen.main.bounds.width * 2,
   height: UIScreen.main.bounds.height * 2
)
var testFill = SKShapeNode(path: CGPath(rect: testPath, transform: nil))

testFill.fillColor = UIColor.black
addChild(testFill)

Для iPhone 7 это работает отлично. Для iPhone 5 я получаю дополнительное пространство сверху и справа, такой же результат для Ipad. Однако для iPhone 7+ я выхожу за пределы экрана.

У меня первый вопрос, а зачем мне брать main.bounds.height * 2, чтобы закрывать экран по вертикали. Разве * 1 не должно быть достаточно? Во-вторых, что более важно, почему я получаю такие разные результаты на разных устройствах?


person Carl Jonsson    schedule 30.03.2018    source источник
comment
Вероятно, это вызвано тем, что вы проектируете свои экраны на iPhone 7 и неправильно изменяете размер сцены при изменении кадра контроллера представления.   -  person Sulthan    schedule 30.03.2018
comment
Какова ваша цель, хотите ли вы, чтобы все занимало одинаковое количество места на экране, например. кнопка занимает 25% экрана на всех устройствах; или вы хотите показать больше сцен, когда вы находитесь на экранах с большими устройствами, например. кнопка всегда будет занимать 32 пикселя, но на iphone Plus можно разместить больше кнопок, чем на обычном iPhone.   -  person Knight0fDragon    schedule 30.03.2018


Ответы (3)


Вы столкнетесь со многими проблемами, если будете двигаться в этом направлении!

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

override func viewDidLoad() {
    super.viewDidLoad()
    let skView = SKView(frame: self.view.bounds) 
    view.addSubview(skView);
    let scene = MyScene(size: view.bounds.size) // <- construct your scene with the screen size
    skView.presentScene(scene)
  }

Затем вы можете заполнить свою сцену и использовать значение размера для размещения узлов.

person Florian Burel    schedule 30.03.2018
comment
Это только половина решения. Вы также должны изменить размер сцены, как только контроллер изменит свой размер. - person Sulthan; 30.03.2018
comment
Да, вы делаете, но вы продолжаете использовать размер вашего контроллера, а не размер основного экрана ... но да, есть еще код для написания :) - person Florian Burel; 30.03.2018
comment
Вы действительно не должны использовать либо. Вы должны использовать ограничения при настройке представления, а затем использовать статический размер для своей сцены. Если вы планируете использовать полноэкранные точки без масштабирования, вы устанавливаете scaleMode на .resize, а затем используете сцены bounds, когда вам нужно определить размер сцены. - person Knight0fDragon; 30.03.2018

Возможно, вам следует проверить свой info.plst, чтобы увидеть строку о экране запуска: https://stackoverflow.com/a/62749138/13433324

person Pavel L.    schedule 06.07.2020

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

2- Каждое устройство имеет свой собственный размер экрана, поэтому его размер * 2 также будет другим.

person Sh_Khan    schedule 30.03.2018