我无法弄清楚如何在
Swift Playgrounds for iPad中布置视图,尽管这可能也与Mac用户有关.
下面的代码应该创建一个带有红色正方形(也是一个视图)的视图,该视图靠近其“超级视图”的边缘,但不会触及它们.
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
结果不是你所期望的:
我怀疑我知道这里发生了什么;实时视图的大小固定,大于显示区域.当视图充当实时视图时,将忽略视图的某些特征.但是,我无法找到文档中提到的位置,这让我感到烦恼.更重要的是,我该如何处理?我希望能够布局简单的UI,这些UI会根据实时视图的当前大小进行更改.我不知道如何在没有试用的情况下解决这个问题.错误和硬编码,这是我真正想避免的两件事.
解决方法
I suspect I know what is going on here; live views are at a fixed size that is larger than the display area.
实际上它更像是另一种方式. iPad屏幕宽1024点(横向).右侧窗格(显示您的实时视图)宽512点.操场强制您的根视图(v)填充该窗格,在左侧,右侧和顶部(以及底部的更多位置)插入40个点.因此,您的根视图的宽度被强制为432(= 512 – 2 * 40),小于您指定的500.
在代码中创建的视图(与您的一样)具有translatesAutoresizingMaskIntoConstraints = true和调整大小为0的掩码,这意味着在调整其父级的大小时,根本不调整视图的帧.因此,游乐场将根视图调整为宽度432,但您的根视图不会移动或调整其子视图(sqv).
最简单的解决方法是设置子视图的自动调整遮罩,以表示您保留在根视图的右下边缘附近的意图.这意味着它应具有灵活的左上边距和左边距:
let v = UIView(frame: CGRect(x: 0,height: 50)) sqv.autoresizingMask = [.flexibleLeftMargin,.flexibleTopMargin] sqv.backgroundColor = .red v.addSubview(sqv) PlaygroundPage.current.liveView = v
结果: