【问题标题】:Sizing of Live Views in Swift PlaygroundSwift Playground 中实时视图的大小
【发布时间】:2017-01-21 13:29:20
【问题描述】:

我在弄清楚如何在 iPad 版 Swift Playgrounds 中布置视图时遇到了麻烦,尽管这也可能与 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 会发生变化以适应实时视图的当前大小。我不知道如何在没有反复试验和硬编码的情况下解决这个问题,这是我真正想避免的两件事。

【问题讨论】:

    标签: ios swift ipad cocoa-touch swift-playground


    【解决方案1】:

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

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

    在代码中创建的视图(如您的)具有translatesAutoresizingMaskIntoConstraints = true,并且调整大小掩码为 0,这意味着在调整其父视图的大小时根本不调整视图的框架。因此,playground 将根视图的宽度调整为 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
    

    结果:

    【讨论】:

    • 如果我将 translatesAutoresizingMasksIntoConstraints 设置为 true 以实现自动布局,会发生什么情况?
    • 它已经是true,因为这是在代码中创建的视图的默认值。
    • 我知道,但要让自动布局正常工作,我通常必须将其设置为 false。
    • OK,然后设置为 false。我猜你的意思是问“如果translatesAutoresizingMasksIntoConstraintstrue 会发生什么?”答案是它会根据您的自动调整掩码创建约束。如果translatesAutoresizingMaskIntoConstraintstrue,通常你不想在视图上设置其他约束。如果您更愿意使用自动布局约束,您可以这样做,但正如我在回答中所说,“最简单的解决方法是设置自动调整大小掩码”。
    【解决方案2】:
    let sqv = UIView(frame: CGRect(x: UIScreen.mainScreen().bounds.width-50-1, y:400, width: 50, height: 50))
    

    上面的代码将您的子视图放置在距离主视图右侧 1 点的位置。尝试将 x 中 50 后的值 1 更改为所需值。

    【讨论】:

    • 这似乎不起作用。您确定您在谈论 Playgrounds 中的实时视图吗?我打印了 UIScreen.main.bounds,它类似于 1024w,768h,与可见区域相比是巨大的。
    • 您还可以获取超级视图坐标并将您的子视图参考超级视图。让 sqv = UIView(frame: CGRect(x: v.frame.origin.x+1, y:400, width: 50, height: 50))
    • 如果使用带有LiveViewEdgeToEdge 键的游乐场书,如果宽度除以2,这可能会起作用。
    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多