Swift 如何根据位置更改UIPickerView标题文本颜色

Swift 如何根据位置更改UIPickerView标题文本颜色,swift,colors,uipickerview,selected,Swift,Colors,Uipickerview,Selected,我想设置一个UIPickerView,以便选中行(中间)的标题为蓝色,上面和下面两行的文本颜色为黑色,其他行的文本颜色为灰色 所以它看起来像这样 在swift中有什么方法可以做到这一点吗?是的,有。下面是一个组件的示例 var pickerArray = [String]() var selectedRow: Int { return pickerView.selectedRow(inComponent: 0) } func pickerView(_ pickerView: UIPi

我想设置一个UIPickerView,以便选中行(中间)的标题为蓝色,上面和下面两行的文本颜色为黑色,其他行的文本颜色为灰色

所以它看起来像这样


在swift中有什么方法可以做到这一点吗?

是的,有。下面是一个组件的示例

var pickerArray = [String]()
var selectedRow: Int {
    return pickerView.selectedRow(inComponent: 0)
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    pickerView.reloadComponent(component)
}

func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
    var color = UIColor.gray

    if row == selectedRow {
        color = UIColor.blue
    } else if selectedRow == row - 1 || selectedRow == row + 1 {
        color = UIColor.black
    }

    return NSAttributedString(string: pickerArray[row], attributes: [NSAttributedString.Key.foregroundColor: color])
}
也许它以另一种方式存在,但我认为这就足够了:]

//更新1:不推荐

您可以覆盖(hitTest:point:event)并从中返回self,然后在(touchesMoved:touches:event)上重新加载组件。但是卷轴和拾取器上的触摸将不起作用。您将需要执行其他操作:(

//更新2:结果:
是的。下面是一个组件的示例

var pickerArray = [String]()
var selectedRow: Int {
    return pickerView.selectedRow(inComponent: 0)
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    pickerView.reloadComponent(component)
}

func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
    var color = UIColor.gray

    if row == selectedRow {
        color = UIColor.blue
    } else if selectedRow == row - 1 || selectedRow == row + 1 {
        color = UIColor.black
    }

    return NSAttributedString(string: pickerArray[row], attributes: [NSAttributedString.Key.foregroundColor: color])
}
也许它以另一种方式存在,但我认为这就足够了:]

//更新1:不推荐

您可以覆盖(hitTest:point:event)并从中返回self,然后在(touchsmoved:touchs:event)上重新加载组件。但选择器上的滚动和触摸将不起作用。您需要执行其他操作:(

//更新2:结果:
@Deryck Lucian更新答案

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        let pickerLabel = UILabel()
        pickerLabel.textColor = (row == pickerView.selectedRow(inComponent: component)) ? UIColor.red : UIColor.green
        pickerLabel.text = List[row]
        pickerLabel.textAlignment = .center
        return pickerLabel
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        pickerView.reloadComponent(component)

    }

@Deryck Lucian更新答案

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        let pickerLabel = UILabel()
        pickerLabel.textColor = (row == pickerView.selectedRow(inComponent: component)) ? UIColor.red : UIColor.green
        pickerLabel.text = List[row]
        pickerLabel.textAlignment = .center
        return pickerLabel
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        pickerView.reloadComponent(component)

    }

我想要的是在滚动时改变颜色,但我想这在我们使用UIPickerView提供的APi中是不可能的。但是感谢您的回复!查看我的更新。也许您会比我的工作更幸运:]顺便问一下,我的NSAttributed String的字体部分不工作,您知道为什么吗?嗯,奇怪。我添加了一个s您使用的结果提示:
func pickerView(pickerView:UIPickerView,titleForRow行:Int,forComponent组件:Int)->字符串?{return pickerArray[row]}
我想要的是在滚动时改变颜色,但我想这对于我们使用UIPickerView提供的APi来说是不可能的。但是感谢您的回复!查看我的更新。也许您会比我的工作更幸运:]顺便问一句,我的NSAttributed String的字体部分不起作用了。您知道为什么吗?嗯,奇怪。我有广告您使用的结果的屏幕截图:
func pickerView(\upickerview:UIPickerView,titleForRow行:Int,forComponent组件:Int)->String?{return pickerArray[row]}