2015-05-14 5 views
7

Я делаю базовое приложение Minesweeper для практики/развлечения в быстрой форме. Я хочу сделать так, чтобы размер платы (10 плиток шириной) адаптировался к любому экрану iOS.Почему ширина рамки вида всегда 600 на 600 с автозапуском

Для этого я устанавливаю размер каждой плитки, получая мой tileContainer view.frame.width и/10.

Моя проблема заключается в том, что вид tileContainer не установлен в 600, независимо от того, что. На моей раскадровке я установил tileContainer равным ширине View Container, нажав CTR, нажав &, перетащив его в вид и выбрав равную ширину. Таким образом, ширина tileContainer устанавливается равной 600, независимо от устройства, на котором я тестирую. (что является моей проблемой, ширина должна меняться в зависимости от ширины экрана, а не постоянной 600)

Кто-нибудь знает, как я могу получить нужную ширину экрана независимо от того, какое устройство оно используется?

+0

«На моей раскадровке я установил tileContainer равно ширине Посмотреть контейнер, К.Т. щелчка и перетаскивание с точкой зрения и выбором одинаковой шириной.» Это похоже на правильный путь. –

+0

Визуально он отлично работает, правильно устанавливает ширину представления в визуальном смысле, но вызов в коде для tileContainer.frame.width всегда будет возвращать 600. Если я тестирую iPhone 6, изменяемый размер iPhone, iPhone 5s. Всегда возвращает 600 –

+0

И поскольку он равен 600, ширина плитки установлена ​​равной 60, и они быстро заканчиваются на выходе из экрана –

ответ

15

Когда вы используете автоматическую компоновку, подпрограммы выкладываются после функции viewDidLayoutSubviews. Поэтому, если вы звоните tileContainer.frame.size до этого, например, в viewDidLoad, оно всегда будет 600 на 600 (что является размером по умолчанию в раскадровке).

viewDidLayoutSubviews: Названный уведомить контроллер представления, что его точка зрения просто выложил его подвидов. reference

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    print(tileContainer.frame.size); // This is actual size you are looking for 
} 
+0

Спасибо, что имеет смысл и ответил на мой вопрос. Вы знаете функцию, которая будет вызвана, или способ ждать выполнения кода после того, как все загружено? Потому что viewDidLayoutSubviews() вызывается дважды для меня. –

+0

Здравствуйте, @EvanNudd, да, эта функция будет вызвана несколько раз. См. Это [сообщение] (http://stackoverflow.com/questions/27014360/why-viewdidlayoutsubviews-call-multiple-times) для объяснения. Но я думаю, что все в порядке. Например, при повороте устройства ширина будет определенно изменена, и вам нужно будет соответствующим образом изменить свои плитки. –

+1

Я думаю, вы пытаетесь создать некоторые подвидности как плитки? Если это так, то вы можете поместить код инициализации alloc в viewDidLoad, а затем поместить некоторый код перестановки/изменения размера в 'viewDidLayoutSubviews'. –

2

Короткий ответ:. UIScreen.mainScreen() bounds.size.width всегда возвращает ширину экрана.

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

Другой стратегией, использующей автоотключение, было бы установить расстояние между ячейками равным 0 и оставить неограниченную ширину и высоту. Если у вас есть 10 ячеек с 0 пробелами между ячейками и eachother и 0 пробелов между передней и задней ячейками и контейнером, тогда они автоматически возьмут 1/10 ширины контейнера.

Дополнительное примечание: если вы используете размерные классы/макет, размер представления не настроен должным образом до тех пор, пока не будут выложены надстройки, поэтому, если вы пытаетесь сделать эту информацию ширины в viewDidLoad, например, ширина будет width of Any Любой класс размера (600).

3

В то время как принятые ответы являются правильным ответом, я думал, что могу хотя бы сказать, что вы можете заставить взгляд нарисовать себя перед ударом viewDidAppear:.

Либо, вы можете в viewDidLoad: вызова:

view.setNeedsLayout()
view.layoutIfNeeded()

Или, если вы создаете его "снаружи":

let vc = UIViewController()
let _ = vc.view

или

let vc = UIViewController()
vc.view.setNeedsLayout()
vc.view.layoutIfNeeded()

+0

Добавить 'view.setNeedsLayout()' и 'view.layoutIfNeeded()' в 'viewDidLoad' работает для меня. – yuchen

+0

Добавляя только 'view.layoutIfNeeded()' работал для меня тоже, спасибо. – erickva

Смежные вопросы