pickerView不同的行高

时间:2015-07-27 11:33:40

标签: ios swift uipickerview reload

我有一个pickerView,其中包含从网站加载的数据。我想为pickerView的每一行设置高度。

以下是我尝试的内容,但似乎pickerView只接受所有行的一个值。

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
}

第一次,categories数组为空,rowHeightForComponent使用常量值。但是当我从Core Data加载数据时,我希望我的pickerView使用新的componentHeight重新加载自己,但是当我写这篇文章时它没有调用:

pickerView.reloadAllComponents()

3 个答案:

答案 0 :(得分:1)

我猜选择器视图会在第一时间缓存它的大小信息。 所以使用reloadAllComponents,您可以从数据源和委托更新组件的数据,但无法更新行高。

解决方法:

数据源和委托设置为nil,直到准备好数据。 像:

override func viewDidLoad() {
    super.viewDidLoad()

    //Setup UI...

    self.pickerView.dataSource = nil
    self.pickerView.delegate = nil
}
数据就绪后,

和数据源和委托设置正确。 像:

func updateUI() {

    // ...data is ready

    self.pickerView.dataSource = self // set data source
    self.pickerView.delegate = self // set delegate
    self.pickerView.reloadAllComponents()

}

答案 1 :(得分:1)

我发现当你致电reloadAllComponents:时,所有的委托/数据源方法都被称为,除了 rowHeightForComponent:

我找到了解决问题的解决方法。每次要通过调用reloadAllComponents:设置行的高度时,请重置UIPickerView的委托。像这样:

pickerView.delegate = self
pickerView.reloadAllComponents()

答案 2 :(得分:0)

heightForView用于指定高度,viewForRow允许您自定义行。因此,请使用heightForView方法设置新的高度,并使用方法viewForRow方法而不是heightForView自定义行,而不是像现在一样。

如果没有在heightForView方法中指定,XCode就无法更改高度。因为它需要heightForView

最后,在您从网络获取数据时重新加载数据。