使用自动布局以实用的相同高度定位 3 个图像视图

use auto layout to position 3 image view pragmatically the same height

我下面的代码声明了 3 个图像视图。我希望它们都具有相同的高度并填满 uiview。它应该看起来像下面这张照片

我需要以某种方式让图像视图相互交互,但我不知道如何实现。这应该在所有代码中完成。没有使用故事板。

    import UIKit

class ViewController: UIViewController {

var pic = UIImageView()
var pic2 = UIImageView()
var pic3 = UIImageView()


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    [pic,btn].forEach({
        [=10=].translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview([=10=])
        [=10=].backgroundColor = .systemRed
    })
    pic3.backgroundColor = .systemOrange
       pic2.backgroundColor = .systemPink


    pic.topAnchor.constraint(equalTo: view.topAnchor, constant: 10).isActive = true
    pic.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200).isActive = true
    pic.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 15).isActive = true
    pic.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -15).isActive = true

    pic2.topAnchor.constraint(equalTo: view.topAnchor, constant: 10).isActive = true
    pic2.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -100).isActive = true
    pic2.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 15).isActive = true
    pic2.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -15).isActive = true

    pic3.topAnchor.constraint(equalTo: view.topAnchor, constant: 10).isActive = true
    pic3.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -100).isActive = true
    pic3.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 15).isActive = true
    pic3.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -15).isActive = true
}
}

使用自动布局约束:对齐边缘,然后使用视图的(或 SafeAreaLayoutGuide 的)高度锚点和三分之一的乘数。为了允许舍入,只将高度锚点分配给三个视图中的两个,并使用 top/bottom 锚点设置剩余视图的高度。

   let view1 = UIView()
   view1.translatesAutoresizingMaskIntoConstraints = false
   view1.backgroundColor = .blue
   let view2 = UIView()
   view2.translatesAutoresizingMaskIntoConstraints = false
   view2.backgroundColor = .yellow
   let view3 = UIView()
   view3.translatesAutoresizingMaskIntoConstraints = false
   view3.backgroundColor = .purple
   view.addSubview(view1)
   view.addSubview(view2)
   view.addSubview(view3)

   //set constraints
   NSLayoutConstraint.activate([
      // anchor edges
      view1.leadingAnchor.constraint(equalTo: view.leadingAnchor),
      view1.trailingAnchor.constraint(equalTo: view.trailingAnchor),
      view2.leadingAnchor.constraint(equalTo: view.leadingAnchor),
      view2.trailingAnchor.constraint(equalTo: view.trailingAnchor),
      view3.leadingAnchor.constraint(equalTo: view.leadingAnchor),
      view3.trailingAnchor.constraint(equalTo: view.trailingAnchor),
      // set anchors governing height
      view1.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
      view2.topAnchor.constraint(equalTo: view1.bottomAnchor),
      view2.bottomAnchor.constraint(equalTo: view3.topAnchor),
      view3.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
      view1.heightAnchor.constraint(equalTo: view.layoutMarginsGuide.heightAnchor, multiplier: 1/3),
      view2.heightAnchor.constraint(equalTo: view.layoutMarginsGuide.heightAnchor, multiplier: 1/3)
   ])

以下是使用 UIStackView 的可能解决方案:

(免责声明:在浏览器中输入,未在 Xcode 中测试)

此外,您可能仍然需要自动布局以使 stackView 覆盖屏幕。

var view1 = UIView()
var view2 = UIView()
var view3 = UIView()

override func viewDidLoad() {
    super.viewDidLoad()

    view1.backgroundColor = .blue
    view1.backgroundColor = .green
    view1.backgroundColor = .red

    let stackView = UIStackView(arrangedSubviews: [view1, view2, view3])  

    stackView.axis = .vertical
    stackView.distribution = .fillEqually

    self.view.addSubview(stackView)

}