2
1

More than 3 years have passed since last update.

AutoLayout、バッティングが起きたとき、プライオリティは低いがバッティングの原因ではないものはどう扱われるのか

Last updated at Posted at 2019-11-04

今回もAutoLayoutです。

A,B,C,D,Eの5つの荷物が入ったかばんを金属探知機にかけたら警報が鳴った。
Aを取り出してから再度かばんを検査するとまた警報が鳴った。
次にBを取り出して検査するとまた警報が鳴った。
さらにCを取り出して検査すると今度は警報が鳴らなかった。

あなたが次にするべきことは次のうちどちらか。

  • かばんの中身はDとEで決定する
  • AとBを順番にかばんに入れて検査し、警報が鳴らないならかばんに入れておくことを決定する(要するにAとBについて調べる)

これは私がAutoLayoutで感じた疑問である。

AutoLayoutこの先生きのこる問題

AutoLayoutの3つの制約A,B,Cがある。
プライオリティはA>B>C。
ある状況でAとBはバッティングしてAとCはバッティングしなかった。
Bを排除することは決定だが、AとバッティングしないCはどうなるのか。

結論

Cは排除される。

検証コード

import UIKit

class ViewController: UIViewController {

    let viewA = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        viewA.backgroundColor = UIColor.red

        view.addSubview(viewA)

        viewA.translatesAutoresizingMaskIntoConstraints = false
        viewA.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 50.0).isActive = true
        viewA.heightAnchor.constraint(equalToConstant: 100.0).isActive = true
        viewA.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true

        viewA.widthAnchor.constraint(greaterThanOrEqualToConstant: 50.0).isActive = true

        let w2 = viewA.widthAnchor.constraint(equalToConstant: 30.0)
        w2.priority = UILayoutPriority(rawValue: 999.0)
        w2.isActive = true

        let w3 = viewA.widthAnchor.constraint(equalToConstant: 200.0)
        w3.priority = UILayoutPriority(rawValue: 998.0)
        w3.isActive = true
    }
}

結果

Untitled 2.png
縦100に対して横50。

ちなみに

AとCだけにするとちゃんとCが生きてます。
Untitled.png
縦100に対して横200。

お願い

公式の情報を見つけてないので知っている人いたら教えて下さい。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1