Swift Playground中实时视图的大小

问题描述:

我无法弄清楚如何在iPad的Swift Playgrounds中布置视图,但这也可能与Mac用户有关。Swift Playground中实时视图的大小

下面的代码应该创建一个视图,该视图带有一个红色正方形(也是一个视图),该视图靠近其超级视图的边缘,但未触及它们。

let v = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500)) 
let sqv = UIView(frame: CGRect(x: 400, y: 400, width: 50, height: 50)) 
sqv.backgroundColor = .red 
v.addSubview(sqv) 
PlaygroundPage.current.liveView = v 

结果不是你所期望:

enter image description here

我怀疑我知道是怎么回事;实时视图的尺寸大于显示区域。当它作为实时视图时,视图的某些特征将被忽略。但是,我无法找到文档中提到的哪些地方,这让我感到困扰。更重要的是,我该如何处理这个问题?我希望能够布置简单的用户界面以适应当前的实时视图大小。我不知道如何解决这个问题没有试验&错误和硬编码,这是我真的很想避免的两件事。

let sqv = UIView(frame: CGRect(x: UIScreen.mainScreen().bounds.width-50-1, y:400, width: 50, height: 50)) 

上述代码将您的子视图从主视图的右侧移开1点。尝试将x在50之后的值1更改为所需的值。

+1

似乎并没有得以顺利。你确定你在谈论游乐场的现场观看吗?我打印了UIScreen.main.bounds,它与1024w,768h相比,与可见区域相比是巨大的。 – PopKernel

+0

您还可以获取超级视图坐标并将您的子视图引用超级视图。让sqv = UIView(frame:CGRect(x:v.frame.origin.x + 1,y:400,width:50,height:50)) – phamot

我怀疑我知道这里发生了什么;实时视图的尺寸大于显示区域。

其实它更像是相反的方式。 iPad屏幕宽1024点(横向)。右侧窗格(显示实时视图的位置)为512点宽。操场强制您的根视图(v)填充该窗格,在左侧,右侧和顶部插入40个点(以及更多底部)。所以你的根视图的宽度被强制为432(= 512 - 2 * 40),小于你指定的500。

在代码中创建的视图(如您的视图)具有translatesAutoresizingMaskIntoConstraints = true和调整大小的掩码为0,这意味着在调整父级的大小时不会调整视图的帧。因此,操场将您的根视图的大小调整为宽度432,但您的根视图不会移动或调整其子视图的大小(sqv)。

最简单的解决方法是设置子视图的自动调整掩码来表达您的意图,即它保持在根视图的右边缘和底部边缘附近。这意味着它应该具有灵活的顶部和左侧边距:

let v = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500)) 
let sqv = UIView(frame: CGRect(x: 400, y: 400, width: 50, height: 50)) 
sqv.autoresizingMask = [.flexibleLeftMargin, .flexibleTopMargin] 
sqv.backgroundColor = .red 
v.addSubview(sqv) 
PlaygroundPage.current.liveView = v 

结果:

enter image description here

+0

如果为自动布局目的将translatesAutoresizingMasksIntoConstraints设置为true,会发生什么? – PopKernel

+0

它已经是'true'了,因为这是在代码中创建的视图的默认值。 –

+0

我知道,但让自动布局工作,我经常不得不将它设置为false。 – PopKernel