

Swiftプログラムをしていてwarningも気になり思わず質問させてください。  
storyboardでUIViewをレイアウトしていてConstraintsを使って配置しています。  
そのUIViewを横画面にした際にUIViewの位置やサイズを変更したいと思っています。  
しかし、Constraintsを指定するとframeなどで位置・サイズ指定しても変わりません。  
そのためConstraintsを削除してプログラムで指定してあげるのですが、Ambiguos Layoutのwarningが発生します。  
位置が特定されていないからです。

このような場合、熟達者の皆さんはどのようにプログラムしているのでしょうか？  
1\. Ambiguos Layoutのwarningなんか気にしない  
2\. warningは発生させなく、プログラムで操作する何かがある。

私は2を期待して投稿しています。ご存知の方がいらっしゃればご教示お願いします。


CC BY-SA 3.0
2017-11-04T12:53:31.553
39290
2023-09-29T08:00:30.070
8593
question
swift
SwiftでUIViewの縦・横画面のレイアウトでAmbiguos Layoutを出さないようにする方法


横画面用のレイアウトを満たす制約を設定すれば良いだけです。  
私が最近実装したケースでは、縦画面用の NSLayoutConstraint と横画面用の NSLayoutConstraint
をそれぞれ配列にもっておき、画面の向きが変わった際にそれぞれの `isActive` プロパティを `true` / `false`
に設定するようにしました。

**追記**  
サンプルコードを以下に示します。

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        var portraitConstaints:[NSLayoutConstraint] = []
        var landscapeConstaints:[NSLayoutConstraint] = []
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let subview = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
            subview.translatesAutoresizingMaskIntoConstraints = false
            self.view.addSubview(subview)
            subview.backgroundColor = .blue
    
            // 縦横共通の制約
            subview.leftAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leftAnchor).isActive = true
            subview.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
    
            // 縦画面の制約（画面の上半分にsubviewを配置）
            portraitConstaints = [
                subview.rightAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.rightAnchor),
                subview.heightAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.heightAnchor, multiplier: 0.5)
            ]
    
            // 横画面の制約（画面の左半分にsubviewを配置）
            landscapeConstaints = [
                subview.widthAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.widthAnchor, multiplier: 0.5),
                subview.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor)
            ]
    
            // 初期状態はとりあえず縦画面の制約を有効にしておく（横画面で起動される場合は要修正）
            portraitConstaints.forEach { (cons) in
                cons.isActive = true
            }
        }
    
        override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
            super.viewWillTransition(to: size, with: coordinator)
    
            let portrait = size.height > size.width
    
            portraitConstaints.forEach { (cons) in
                cons.isActive = portrait
            }
            landscapeConstaints.forEach { (cons) in
                cons.isActive = !portrait
            }
    
            coordinator.animate(alongsideTransition: { (_) in
                self.view.layoutIfNeeded()
            }) { (_) in
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2017-11-06T05:23:32.313
39331
2017-11-13T02:40:34.667
2017-11-13T02:40:34.667
23829
23829
39290
answer