为什么视图的帧宽度通过自动布局总计600到600

时间:2015-05-14 02:50:17

标签: ios swift storyboard autolayout

我正在为swift中的练习/乐趣制作一个基本的扫雷应用程序。我想这样做,所以板的大小(10瓦宽)适应任何iOS屏幕。

为此,我通过获取tileContainer view.frame.width和/ 10来设置每个图块的大小。

我的问题是tileContainer视图设置为600,无论如何。在我的故事板上,我将tileContainer设置为等于View容器的宽度,按CTR点击&拖动到视图并选择相等的宽度。无论我正在测试的设备如何,这都会将tileContainer的宽度设置为600。 (这是我的问题,宽度应根据屏幕宽度而变化而不是常数600)

有没有人知道如何获得适当的屏幕宽度,无论它使用的是什么设备?

3 个答案:

答案 0 :(得分:21)

使用自动布局时,子视图将在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
}

答案 1 :(得分:4)

虽然接受的答案是正确答案,但我认为至少可以说你可以强迫视图在点击viewDidAppear之前画出自己:。

或者,你可以在viewDidLoad:电话中发出:

view.setNeedsLayout()
view.layoutIfNeeded()

或者如果您从"外部":

创建它

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

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

答案 2 :(得分:3)

简答:UIScreen.mainScreen()。bounds.size.width始终返回屏幕的宽度。

答案很长:听起来你正在使用带有大小类的自动布局。你可以使用约束来完成所有工作。您可以从瓷砖到容器设置比例宽度和高度约束,以使瓷砖为容器宽度和高度的10%。然后,您可以将所有其他图块设置为具有与该图块相同的宽度和高度。然后,使用约束将它们放在网格中。

使用自动布局的另一种策略是将单元格之间的间距设置为0,并保持宽度和高度不受约束。如果你有10个单元格和单元格之间有0个空格,前后单元格和容器之间有0个空格,那么它们将自动占据容器宽度的1/10。

另外请注意,如果使用大小类/自动布局,在布局子视图之前未正确设置视图大小,因此,如果您尝试在viewDidLoad中执行此宽度内容,则宽度仍将是宽度Any Any size class(600)。