UIDatePicker
のようなカスタムピッカーコントロールを作成しようとしていますが、ピッカーのすべてのロジックが含まれ、ターゲットアクションの動作を許可する別のデータソースがあります。サブクラスUIControlでカスタムピッカーを作成する
これを行うには、UIControl
をサブクラス化し、UIPickerView
を追加し、ピッカービューのデータソースを設定し、サブクラスに委譲します。私の問題は意見のサイジングです。
すべてのデバイスでUIDatePicker
と遊んだことがあります。デフォルトの高さは216、デフォルトの幅は320です。幅を伸ばすと、ピッカービューは伸びませんが、高さを伸ばすと伸びます。システムに合わせるために、ピッカーのサイズを同じにしたいと思います。
サブクラスのnibファイルを作成しようとしました。私はビューを320x216にサイズ変更し、UIPickerView
を追加し、IBOutlet
としてそれをフックしました。 init?(coder aDecoder: NSCoder)
の私の実装では、データソースとピッカーのデリゲートを設定しましたが、私がテストアプリケーションを実行すると、接続されたUIPickerView
がまだその時点でnil
であるためクラッシュしました。
私の目標はinit()
とUIDatePicker
でできることのようなストーリーボードでこれを使用できるようにするためです。ペン先を捨ててコード内のすべてをカプセル化しようとしています。 UIDatePicker
と同じように動作するようにビューを設定するにはどうすればよいですか? (それはすべてのストーリーボードに使用するコードでなければならないので、ペン先を使用せずに)ここで
は私の現在の試みです:
class FWHeightPicker: UIControl {
let pickerView: UIPickerView
convenience init() {
let size = CGSize(width: 320, height: 216)
let origin = CGPoint(x: 0, y: 0)
let frame = CGRect(origin: origin, size: size)
self.init(frame: frame)
}
override init(frame: CGRect) {
pickerView = UIPickerView(frame: frame)
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
let size = CGSize(width: 320, height: 216)
let origin = CGPoint(x: 0, y: 0)
let frame = CGRect(origin: origin, size: size)
pickerView = UIPickerView(frame: frame)
super.init(coder: aDecoder)
commonInit()
}
func commonInit() {
let topConstraint = NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal, toItem: pickerView, attribute: .top, multiplier: 1, constant: 0)
let bottomConstraint = NSLayoutConstraint(item: self, attribute: .bottom, relatedBy: .equal, toItem: pickerView, attribute: .bottom, multiplier: 1, constant: 0)
self.addConstraints([topConstraint, bottomConstraint])
pickerView.delegate = self
pickerView.dataSource = self
}
}
extension FWHeightPicker: UIPickerViewDelegate, UIPickerViewDataSource {
// Delegate/Datasource implementations
}