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

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

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

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

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

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)
    }
}

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

    @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
        }
    }