代码之家  ›  专栏  ›  技术社区  ›  Sweeper

如何添加约束,使视图的尺寸在方向更改时不会更改?

  •  -1
  • Sweeper  · 技术社区  · 6 年前

    我希望我的视图具有以下属性(数字是任意选择的):

    • 宽度等于高度除以1.2
    • 停留在屏幕右下角
    • 纵向时,高度为屏幕高度的1/7。
    • 方向改变时宽度和高度不变

    前三个需求可以很容易地转化为 UILayoutConstraint S.我用Snapkit完成了它们,只是因为它读得更清楚。你应该明白我的意思,即使你以前从未使用过Snapkit。

    let myView = UIView(frame: .zero)
    myView.backgroundColor = .green
    view.addSubview(myView)
    myView.snp.makeConstraints { (make) in
        make.right.equalToSuperview().offset(-8)
        make.bottom.equalToSuperview().offset(-8)
        make.width.equalTo(myView.snp.height).dividedBy(1.2)
        make.height.equalTo(view.snp.height).dividedBy(7) // *
    }
    

    问题是最后一个要点。当我将设备从纵向旋转到横向时,原来旋转前的宽度变成旋转后的高度。这导致我的观点变小。

    基本上,我想替换标记为 * 就这样:

    make.height.equalTo(max(view.snp.height, view.snp.width)).dividedBy(7)
    

    但我不认为 max(a, b) 是Snapkit还是 布局约束 应用程序编程接口。

    当然,还有其他的表达方式“等于任何长度的长度”,对吗?

    P.S.我没有给这个贴标签 因为我也会接受一个使用 布局约束 应用程序编程接口。

    1 回复  |  直到 6 年前
        1
  •  1
  •   pacification    6 年前

    看起来你有两个选择:

    1. 硬编码高度值。
    2. 尝试使用 nativeBounds :

    此矩形基于设备的纵向向上方向。该值不会随着设备旋转而改变。

    在这种情况下, height 总是用于纵向模式。

    myView.snp.makeConstraints { make in
        make.right.bottom.equalToSuperview().offset(-8)
        let screenHeight = UIScreen.main.nativeBounds.height / UIScreen.main.nativeScale
        let height = screenHeight / 7
        make.width.equalTo(height).dividedBy(1.2)
        make.height.equalTo(height)
    }