簡體   English   中英

自動布局縱橫比約束

[英]Autolayout aspect ratio constraints

我想如下設置一個子視圖約束。 如果界面為橫向(view.bounds.width> view.bounds.height),則將子視圖的高寬比設置為4:3。 在縱向模式下,應為3:4。 雖然我總是可以通過編程方式在自動旋轉上更改約束,但想知道是否只有一種聰明的設計約束的方法。

您必須像下面的示例一樣監聽UIDevice.orientationDidChangeNotification通知:

class ViewController3: UIViewController {

    let blueSubview: UIView = {
        let view = UIView()
        view.backgroundColor = .blue
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    var blueSubviewHeight = NSLayoutConstraint()
    var blueSubviewWidth = NSLayoutConstraint()

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(refreshConstraints), name: UIDevice.orientationDidChangeNotification, object: nil)

        refreshConstraints()
        setUI()
    }

    fileprivate func setUI() {
        view.backgroundColor = .white

        view.addSubview(blueSubview)
        [blueSubview.leftAnchor.constraint(equalTo: view.leftAnchor),
        blueSubview.topAnchor.constraint(equalTo: view.topAnchor),
        blueSubviewWidth,
        blueSubviewHeight].forEach({ $0.isActive = true })
    }

    @objc func refreshConstraints() {
        NSLayoutConstraint.deactivate([blueSubviewWidth, blueSubviewHeight])

        if view.frame.width > view.frame.height {
            blueSubviewWidth = blueSubview.widthAnchor.constraint(equalToConstant: view.frame.height * (4/3))
            blueSubviewHeight = blueSubview.heightAnchor.constraint(equalToConstant: view.frame.height)
        }
        else {
            blueSubviewWidth = blueSubview.widthAnchor.constraint(equalToConstant: view.frame.width)
            blueSubviewHeight = blueSubview.heightAnchor.constraint(equalToConstant: view.frame.width * (4/3))
        }

        NSLayoutConstraint.activate([blueSubviewWidth, blueSubviewHeight])
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM