[英]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.