pickerView different row height
我有一个带有从网站加载的数据的pickerView。我想为pickerView的每一行设置高度。
这是我尝试过的,但似乎 pickerView 只接受所有行的一个值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { var height: CGFloat = 40 if categories.count != 0 { return heightForView((categories[component].valueForKey("name") as? String)!, font: UIFont(name:"HelveticaNeue-Thin", size: pickerFontSize!)!, width: pickerView.frame.width) + 10 } return height + 10 } func heightForView(text: String, font: UIFont, width: CGFloat) -> CGFloat { let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max)) label.numberOfLines = 0 label.lineBreakMode = NSLineBreakMode.ByWordWrapping label.font = font label.textAlignment = .Center label.text = text label.sizeToFit() return label.frame.height } |
第一次分类数组是空的并且 rowHeightForComponent 使用一个常量值。但是当我从 Core Data 加载数据时,我希望我的 pickerView 用新的 componentHeight 重新加载自己,但是当我写的时候它没有被调用:
1 | pickerView.reloadAllComponents() |
我发现当你调用
我找到了可以解决您的问题的解决方法。每次您希望通过调用
1 2 | pickerView.delegate = self pickerView.reloadAllComponents() |
我猜选择器视图会在第一时间缓存它的大小信息。
因此使用 reloadAllComponents,您可以从数据源和委托更新组件的数据,但不能更新行高。
解决方法:
在准备好数据之前,数据源和委托都设置为 nil。
喜欢:
1 2 3 4 5 6 7 8 | override func viewDidLoad() { super.viewDidLoad() //Setup UI... self.pickerView.dataSource = nil self.pickerView.delegate = nil } |
在数据准备好后正确设置数据源和委托。
喜欢:
1 2 3 4 5 6 7 8 9 | func updateUI() { // ...data is ready self.pickerView.dataSource = self // set data source self.pickerView.delegate = self // set delegate self.pickerView.reloadAllComponents() } |
并且没有在
最后,当您获得来自网络的数据时,重新加载您的数据。