Запустите PickerView из UILabel, чтобы он отображался в модальном режиме снизу экрана, а не скрывайте его - PullRequest
0 голосов
/ 09 октября 2018

У меня есть метка с распознавателем жестов внутри ячейки collectionView.Когда пользователь прикасается к метке, я хочу, чтобы pickerView выглядело так же, как и при подключении pickerView к textField.

Я пытался myLabel.inputView = pickerView

. Я получил эту ошибку ниже.

Невозможно присвоить свойству: 'inputView' - это свойство только для получения

Я сталкивался с некоторыми потоками, где люди скрывали и отображали pickerView вместо того, чтобы он выскакивал.и понижение, как это делает из textField, но никто не объяснил, почему они спрятали / раскрыли его.

Как я могу вызвать PickerView из UILabel?

Это должноСледует отметить, что я не хочу скрывать / показывать это, как и другие ответы, которые я прочитал.

class MyCell: UICollectionViewCell {

    lazy var pickerView = UIPickerView()

    let myLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.isUserInteractionEnabled = true
        return label
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(triggerPickerView))
        myLabel.addGestureRecognizer(tapGesture)

    }

    @objc func triggerPickerView() {
       print("triggerPickerView")
    }
}

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Как уже упоминалось, свойство: inputView доступно только для UILabelView.

Если вы настаиваете на щелчке по метке, чтобы иметь свой pickerView, в раскадровке вам нужен фиксированный UIPickerView внутри представления и анимируйте представление (вместо того, чтобы скрывать / показывать), когда по ярлыку нажимают.

0 голосов
/ 09 октября 2018

Я нашел ответ.

В комментариях @AshlyMills сказал, что причина, по которой я не могу вызвать представление выбора из UILabel, заключается в том, что: " Это невозможно, потому что inputView является свойством get onlyна UIResponder"

Мой обходной путь - использовать UITextField и просто прояснить это.Я добавил pickerView как inputView к textFiled.Я положил его прямо над этикеткой, и, нажав на него, окно выбора появляется модально снизу, и этикетка все еще видна.Я удалил распознаватель жестов, потому что в этом не было необходимости.

class MyCell: UICollectionViewCell {

    lazy var pickerView = UIPickerView()

    let myLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.isUserInteractionEnabled = true
        return label
    }()

    let clearTextField: UITextField = {
        let textField = UITextField()
        textField.translatesAutoresizingMaskIntoConstraints = false
        textField.backgroundColor = .clear
        return textField
     }()

    override init(frame: CGRect) {
        super.init(frame: frame)


        addSubview(clearTextField)

        clearTextField.topAnchor.constraint(equalTo: myLabel.topAnchor).isActive = true
        clearTextField.leftAnchor.constraint(equalTo: myLabel.leftAnchor).isActive = true
        clearTextField.rightAnchor.constraint(equalTo: myLabel.rightAnchor).isActive = true
        clearTextField.bottomAnchor.constraint(equalTo: myLabel.bottomAnchor).isActive = true

        clearTextField.inputView = pickerView
    }
}
...