From the documentation, it looks like reloadAllComponents: just calls the delegate for new data inside the components, but apparently doesn't ask for size.
Instead, I would try calling rowSizeForComponent: for each component. The documentation for this method says: "Returns: row size in this component. Usually this is the size needed to display the largest row or view used as a row in the component. The select view selects the value of this property by calling pickerView: widthForComponent: and pickerView: rowHeightForComponent: delegate methods and cache it. The default value is (0, 0). "
Then, in your UIPickerViewDelegate, I would use both pickerView:widthForComponent: and pickerView:rowHeightForComponent:
source share