Swift コードで追加した複数のボタンにオートレイアウトの制約をつけたい
@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
}
}