2017-02-06 6 views
1

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 
} 

答えて

0

あなたは自分のFWHeightPickerにサブビューとしてあなたpickerViewを追加する必要があります。次に、pickerViewのデフォルトのAutoLayout制約を、希望の制約のためにpickerView.translatesAutoresizingMaskIntoConstraints = falseに落としてください。

あなたの便利なinit()で定義されたビューのサイズに合うようにピッカーの幅と高さを伸ばしたり縮めたりするコードはちょっとありました(利便性のために拡張子を削除しました):

class FWHeightPicker: UIControl, UIPickerViewDelegate, UIPickerViewDataSource { 

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

    pickerView = UIPickerView() 

    super.init(coder: aDecoder) 
    commonInit() 
    } 

    func commonInit() { 

    pickerView.delegate = self 
    pickerView.dataSource = self 

    addSubview(pickerView) 

    pickerView.translatesAutoresizingMaskIntoConstraints = false 

    let topConstraint = NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal, toItem: pickerView, attribute: .top, multiplier: 1, constant: 0) 

    let bottomConstraint = NSLayoutConstraint(item: pickerView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1, constant: 0) 

    let leftConstraint = NSLayoutConstraint(item: self, attribute: .leading, relatedBy: .equal, toItem: pickerView, attribute: .leading, multiplier: 1.0, constant: 0) 

    let rightConstraint = NSLayoutConstraint(item: pickerView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: 0) 

    self.addConstraints([topConstraint, bottomConstraint, leftConstraint, rightConstraint]) 

    } 

    // Delegate/Datasource implementations 
    func numberOfComponents(in pickerView: UIPickerView) -> Int { 

    return 1 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 

    return 10 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 

    return "row" 
    } 
} 
関連する問題