为什么视图的边框宽度是600,自动布局?

我正在做一个基本的扫雷应用程序的练习/快乐的快速。 我想这样做的董事会(10瓦宽)适应任何iOS屏幕的大小。

要做到这一点,我通过获取我的tileContainer view.frame.width和/ 10来设置每个图块的大小。

我的问题是,tileContainer视图设置为600,无论如何。 在我的故事板上,我设置tileContainer等于视图容器的宽度,通过CTR点击并拖动到视图并select相等的宽度。 这将tileContainer的宽度设置为600,而不pipe我正在testing的设备。 (这是我的问题,宽度应改变取决于屏幕宽度不是一个常数600)

有谁知道我怎样才能得到适当的宽度的屏幕,无论它正在使用的设备?

当您使用自动布局时,子视图将在viewDidLayoutSubviews函数之后进行布局。 因此,如果在tileContainer.frame.size之前调用tileContainer.frame.size (比如在viewDidLoad ,它将始终为600×600(这是故事板中的默认大小)。

viewDidLayoutSubviews :调用来通知视图控制器,它的视图刚刚布置了它的子视图。 参考

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() print(tileContainer.frame.size); // This is actual size you are looking for } 

虽然接受的答案是一个正确的答案,我想我至less可以说,你可以强制视图之前触及viewDidAppear

或者,你可以在你的viewDidLoad: call:

view.setNeedsLayout()
view.layoutIfNeeded()

或者如果你从“外部”创build它:

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

要么

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

简短的回答:UIScreen.mainScreen()。bounds.size.width总是返回屏幕的宽度。

长答案:这听起来像你正在使用大小类自动布局。 你可以使用约束来完成这一切。 你可以设置一个比例的宽度和高度限制,从瓦片到你的容器,使瓦片是容器宽度和高度的10%。 然后,可以将所有其他拼贴设置为具有与该拼贴相同的宽度和高度。 然后,使用约束将它们放置在网格中。

使用自动布局的另一个策略是将单元格之间的间距设置为0,并保持宽度和高度不受限制。 如果你有10个单元之间有0个空格的单元格和相互之间的空格,并且在正反单元格和容器之间有0个空格,那么它们将自动占用容器宽度的1/10。

另外需要注意的是,如果使用大小类/自动布局,视图大小是不正确的,直到子视图布局,所以如果你想在viewDidLoad做这个宽度的东西,例如,宽度仍然是任何宽度任何尺寸的课程(600)。