Чтобы выделить строки в средстве выбора, существует гораздо более простое решение, чем создание собственного представления. То есть использовать приписанный атрибут заголовка.
func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString?
Поскольку эта функция вернется к titleForRow, если вы вернете nil, вы можете вернуть серый для отключенных строк и использовать стандартный titleForRow для возврата остальных. Как пример:
func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
// Need to provide the below function isRowDisabled that returns true as needed
if isRowDisabled(row:row) {
let attributes = [NSAttributedStringKey.foregroundColor: UIColor.gray]
let str = NSAttributedString(string: "my gray text on row \(row)", attributes:attributes)
return str
} else {
return nil
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return "my normal text on row \(row)"
}
Затем вам придется игнорировать didSelectRow для отключенных строк, как упоминалось в других ответах.