37768


`@IBOutlet`で複数のボタンを追加しておくと、どれぞれにオートレイアウトの制約をつけることができますが、`@IBOutlet`なしでループでボタンを追加した場合、それぞれのボタンにオートレイアウトの制約をつける方法がわかりません。

`@IBOutlet`を使わないのは、前もってボタンの数だけ`@IBOutlet var
ボタン名:UIButton!`を用意する必要があるとの理解からです。  
使わない方がスッキリすると考えていることと、ボタンの数が変動するからです。

テストにしているコードを記します。

KeyboardExtentionでの作成において、オートレイアウトでの要素配置が必須ということで、オートレイアウトの制約を設定する必要があり、方法を探しております。

どのように改良すべきか、別の方法の検討が必要なのか、ご提案や改善策をいただければ幸いです。  
よろしくお願いいたします。

[code]

    import UIKit
    
    class KeyboardViewController: UIInputViewController {
    
        @IBOutlet var nextKeyboardButton: UIButton!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Perform custom UI setup here
            self.nextKeyboardButton = UIButton(type: .system)
    
            self.nextKeyboardButton.setTitle(NSLocalizedString("Next Keyboard", comment: "Title for 'Next Keyboard' button"), for: [])
            self.nextKeyboardButton.sizeToFit()
            self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = false
    
            self.nextKeyboardButton.addTarget(self, action: #selector(handleInputModeList(from:with:)), for: .allTouchEvents)
    
            self.view.addSubview(self.nextKeyboardButton)
    
            self.nextKeyboardButton.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
            self.nextKeyboardButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
    
            print("1stViewController's viewDidLoad()　is called)",  UIScreen.main.bounds.size)
    
            //ボタンの表示
            buttonIndicate()
    
        }
    
        override func updateViewConstraints() {
            super.updateViewConstraints()
    
            // Add custom view sizing constraints here
            // viewの高さ設定
            heightControl()
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewDidDisappear(animated)
        }
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
        }
    
        override func viewWillLayoutSubviews() {
             super.viewWillLayoutSubviews()
        }
    
        override func viewDidLayoutSubviews() {
            super.viewDidLayoutSubviews()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated
        }
    
        override func textWillChange(_ textInput: UITextInput?) {
            // The app is about to change the document's contents. Perform any preparation here.
        }
    
        override func textDidChange(_ textInput: UITextInput?) {
            // The app has just changed the document's contents, the document context has been updated.
            var textColor: UIColor
            let proxy = self.textDocumentProxy
            if proxy.keyboardAppearance == UIKeyboardAppearance.dark {
                textColor = UIColor.white
            } else {
                textColor = UIColor.black
            }
            self.nextKeyboardButton.setTitleColor(textColor, for: [])
        }
    
        func heightControl(){
            var cgfHeight:CGFloat = 350.0
            let screenSize = UIScreen.main.bounds
            if screenSize.width>screenSize.height {
                // Landscape
                print("よこ")
                cgfHeight = 300.0
            } else {
                // Portrait
                print("たて")
            }
            print("vDA1" , UIScreen.main.bounds.size , cgfHeight)
            let heightConstraintView = NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 0, constant: cgfHeight)
            //heightConstraintView.priority = 999.0
            view.addConstraint(heightConstraintView)
        }
    
    
        //ボタンの表示
        func buttonIndicate(){
            print("buttonIndicate")
            for roop in 0...11 {
                //ボタンの横位置を決める
                let K_X:Double = 50.0 * Double(roop)
                let button:UIButton = UIButton()
                //サイズと場所を設定する
                button.frame = CGRect(x:K_X, y:10.0, width:24.0, height:20.0)
                //表示されるテキスト
                button.setTitle(String(roop), for: .normal)
                //文字をセンターにする
                button.titleLabel?.textAlignment = NSTextAlignment.center
                //フォントのサイズ指定
                button.titleLabel?.font = UIFont.systemFont(ofSize: 24.0)
                //テキストの色
                button.setTitleColor(UIColor.black, for: .normal)
                //バックグラウンドカラー
                button.backgroundColor = UIColor.green
                //タグ番号
                button.tag = roop
                button.restorationIdentifier = String(roop)
                //ボタンをタップした時に実行するメソッドを指定
                button.addTarget(self, action: #selector(btnPress(_:)), for:.touchUpInside)
    
                //viewにボタンを追加する
                self.view.addSubview(button)
    
                //おそらくここでオートレイアウトの設定をする？
                //ボタンの左端は、親ビューの左端からK_X+20ptの位置
                //self.button.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: CGFloat(K_X + 20)).isActive = true
                //ボタンの高さは50pt
                //self.button.heightAnchor.constraint(equalToConstant: 50.0).isActive = true
            }
        }
    
        func btnPress(_ sender: UIButton){
            print(sender.tag)
        }
    }
    
[/code]

追記：`@IBOutlet var buttons:[UIButton] =
[]`を使うと、`view.addSubview`した複数のものに、個別指定でアクセスできそうですが、オートレイアウトが効きません。

[code]

        @IBOutlet var buttons:[UIButton] = []
    
        //ボタンの表示
        func buttonIndicate(){
            for roop in 0...11 {
    
                ....中略....
    
                buttons.append(button)
            }
    
            //viewにボタンを追加する
            for roop in 0...11{
                self.view.addSubview(buttons[roop])
                buttons[roop].leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: CGFloat(50 * roop)).isActive = true
                buttons[roop].heightAnchor.constraint(equalToConstant: 50.0).isActive = true
                buttons[roop].widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.15).isActive = true
            }
        }
    
[/code]


CC BY-SA 3.0
2017-09-05T02:55:28.500
37722
2017-09-07T02:44:15.957
2017-09-06T10:22:09.887
10845
10845
question
swift ios
Swift コードで追加した複数のボタンにオートレイアウトの制約をつけたい


以下のコードにおいて自己解決しました。

[code]

        @IBOutlet var buttons:[UIButton] = []
    
        //ボタンの表示
        func buttonIndicate(){
            for roop in 0...11 {
    
                ....中略....
    
                //このあと追加する制約とコンフリクトさせないため
                button.translatesAutoresizingMaskIntoConstraints = false
    
                buttons.append(button)
            }
    
            //viewにボタンを追加する
            for roop in 0...11{
                self.view.addSubview(buttons[roop])
                //ボタンに制約の追加
                self.buttons[roop].leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: CGFloat(50 * roop)).isActive = true
                self.buttons[roop].heightAnchor.constraint(equalToConstant: 50.0).isActive = true
                self.buttons[roop].widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.15).isActive = true
            }
        }
    
[/code]


CC BY-SA 3.0
2017-09-07T02:44:15.957
37768
2017-09-07T02:44:15.957
10845
37722
answer