繁体   English   中英

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

[英]Why is frame width of the view alway 600 by 600 with autolayout

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

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

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

有谁知道如何获得适当的屏幕宽度,无论它使用的设备如何?

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

viewDidLayoutSubviews :调用以通知视图控制器其视图刚刚布置了其子视图。 参考

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

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

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

要么,你可以在你的viewDidLoad: call:

view.setNeedsLayout()
view.layoutIfNeeded()

或者,如果您从“外部”创建它:

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中执行此宽度操作,例如,宽度仍将是Any的宽度任何尺寸等级(600)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM