プログラムで作成する必要があるカスタムUIControlオブジェクトをいくつか作成しています。通常、AutoLayoutを使用するときはCGRectを渡します。ビジュアルフォーマット言語使用の場合:UicontrolのクラスでプログラムでVFL制約を使用してUIControlを初期化する(iOS Swift)
override init(frame: CGRect) { super.init(frame: frame) updateLayer() }
のviewDidLoadに制約メソッドによって呼び出されていないが()とCAShapeLayersは更新されません。カスタムボタン/スライダー/つまみなどは機能しますが、目に見えず、タッチされるとすぐに形状を更新できます。あまり役に立ちません。ビューがロードされるとすぐにVFLを使用してカスタムUIControlを画面に表示させる方法はありますか?これは私がやりたいものです。
import UIKit
class ViewController: UIViewController {
let knob = Knob()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(knob)
knob.translatesAutoresizingMaskIntoConstraints = false
let views = [
"slider": knob
]
let formatV = "V:|-[knob(300)]-|"
let formatH = "H:|-[knob(300)]-|"
let VC = NSLayoutConstraint.constraints(withVisualFormat: formatV, options: NSLayoutFormatOptions(), metrics: nil, views: views)
let HC = NSLayoutConstraint.constraints(withVisualFormat: formatH, options: NSLayoutFormatOptions(), metrics: nil, views: views)
self.view.addConstraints(VC)
self.view.addConstraints(HC)
knob.addTarget(self, action: #selector(knobRotated(_:)), for: .touchDown)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@objc func knobRotated(_ sender: Knob) {
print(sender.value)
}
}
または何自動レイアウトとVFLの両方で動作するのUicontrolを作成するための最善のアプローチですか?
ありがとうございます! OPはおかげで、どのような私の目をキャッチすることは一切** VFLは、あなたの答えに**ありませんであることを特徴とする一方で、オープンFUNC layoutSubviews(){ super.layoutSubviews() updateLayer() } – MDJ
をオーバーライドします。これは私が必要なものです。どちらかと言えば、質問に対する貧弱な答えか、貧しい質問に対する大丈夫な答えです。 – dfd
彼の質問は、VFLではなく、オブジェクトのライフサイクルを理解することと関係していました。制約は制約であり、視覚的にフォーマットされているかどうかは関係ありません。 – slickdaddy