web-dev-qa-db-ja.com

スタックビューでコンテナーの高さを設定する方法は?

垂直スタックビューに配置された各コンテナーの高さをパーセンテージで設定できるかどうかを確認したいのですが。スタックビューに3つのコンテナーが必要です。 1つ目は画面サイズの40%、2つ目は20%、3つ目は40%です。ありがとうございました

enter image description here

9
Lachtan

「比例配分」分布タイプは、固有のコンテンツサイズで機能します。

したがって、垂直スタック(高さは600)ビューに2つのビュー、ViewA(組み込みコンテンツの高さ200)とViewB(組み込みコンテンツの高さ100)がある場合、スタックビューはそれらをViewA(高さ400)とViewB(高さ200)にサイズ変更します。

また、

  1. すべてのビューに固有のコンテンツの高さがない場合、垂直スタックビューは常にIBエラー「制約が必要:Y位置または高さ」を表示します。
  2. 固有の高さのないビューは、高さゼロに縮小されます。
  3. 固有の高さを持つビューは、それに比例して分散します。

本当に欲しいもの

'fill'タイプの分布で、2つの制約があります。

  1. ViewA.height = 2 * ViewB.height
  2. ViewB.height = 0.5 * ViewC.height

それで全部です。それが役に立てば幸い。

enter image description here

13
BangOperator

次のように、プログラムで実装して、1つのテキストフィールドを削除し、スタックビューの均等配分の塗りつぶしで返すこともできます。

class LoginViewController: UIViewController{

@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
nameTextField.translatesAutoresizingMaskIntoConstraints = false
emailTextField.translatesAutoresizingMaskIntoConstraints = false
passwordTextField.translatesAutoresizingMaskIntoConstraints = false
}

// IBAction 
@IBAction func registerLoginSegmented(_ sender: Any) {

    if (sender as AnyObject).selectedSegmentIndex == 0{
        // Before we resize (shrink) the nameTextField, change the stackview' distribution from "fill equally" to just "fill"
        stackView.distribution = .fill

        // Change the nameTextField's text
        heightConstraintNameTextField = nameTextField.heightAnchor.constraint(equalToConstant: 0)
        heightConstraintNameTextField?.isActive = true

        // Rearrange the height of the emailTextField
        heightConstraintEmailTextField = emailTextField.heightAnchor.constraint(equalToConstant: 50)
        heightConstraintEmailTextField?.isActive = true

        // Rearrange the height of the passwordTextField
        heightConstraintPasswordTextField = passwordTextField.heightAnchor.constraint(equalToConstant: 50)
        heightConstraintPasswordTextField?.isActive = true

    }
    else {
          // Return the nameTextField by simply trun off the constrants and assign "fillEqually" instead of "fill"
        heightConstraintNameTextField?.isActive = false
        heightConstraintEmailTextField?.isActive = false
        heightConstraintPasswordTextField?.isActive = false
        stackView.distribution = .fillEqually

    }

}
0
Ahmadiah