web-dev-qa-db-ja.com

下部の安全領域の端から画面の下部までの距離を確認するにはどうすればよいですか?

安全領域の下部アンカーと画面の下部の間の距離を計算する必要があります。ビューを与えられたコードでそれを行う方法はありますか?

enter image description here

8
Evgenii

これを試してください

if #available(iOS 11.0, *) {
    let window = UIApplication.shared.keyWindow
    let bottomPadding = window?.safeAreaInsets.bottom
}
26
user6788419

サブビュー(クリア、非表示など)をsafeAreaLayoutGuideの下部に固定して、このビューの下部とビューコントローラーのビューの差をviewDidLayoutSubviewsで計算してみてください。

class ViewController: UIViewController {
    let measuringView = UIView()
    override func viewDidLoad() {
        super.viewDidLoad()
        measuringView.backgroundColor = .Magenta
        measuringView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(measuringView)
        let vConstraint = measuringView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
        let heightConstraint = measuringView.heightAnchor.constraint(equalToConstant: 34)
        var constraints = NSLayoutConstraint.constraints(withVisualFormat: "|[measuring]|", options: [], metrics: nil, views: ["measuring": measuringView])
        constraints.append(vConstraint)
        constraints.append(heightConstraint)
        NSLayoutConstraint.activate(constraints)
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        let measuringBottom = measuringView.frame.Origin.y + measuringView.frame.height
        let viewBottom = view.bounds.height
        let distance = abs(measuringBottom - viewBottom)
        print("distance is \(distance) points")
    }
}

measuring distance

1
jefflovejapan

以前の回答を繰り返します。サブビューをUIViewControllerのビューの下部に固定します。次に、2番目のものをビューのview.safeAreaLayoutGuide.bottomAnchorアンカーに固定します。両方のサブビューが親ビューのtopleading、およびtrailingアンカーを固定しています。次に、viewDidAppearで、2つのサブビューのframe.maxY値の差を出力できると仮定します。これはあなたに違いを与えるはずです。

let viewA = UIView()

let viewB = UIView()

override func viewDidLoad() {

    view.addSubview(viewA)
    view.addSubview(viewB)
    viewA.translateAutoResizingMasksIntoConstraints = false
    viewB.translateAutoResizingMasksIntoConstraints = false


        if #available(iOS 11.0, *) {
            NSLayoutConstraint.activate([viewA.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0),
                                         viewA.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 0),
                                         viewA.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: 0),
                                         viewA.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 0),
                                         viewB.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0),
                                         viewB.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 0),
                                         viewB.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: 0),
                                         viewB.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0)])
        } else {
            // Fallback on earlier versions
        }

}

override func viewDidAppear() {

    super.viewDidAppear()
    print("Safe Distance Value is:\(viewA.frame.maxY - viewB.frame.maxY)")

}

他の人への参照として、値はiPhoneXシミュレーターでは34のように見えます

1
jlmurph