从 UILabel 触发 PickerView 使其以模态方式从屏幕底部出现,而不是 Hide/Unhide 它

Trigger PickerView from UILabel to have it Modally Appear From the Bottom the Screen and not Hide/Unhide It

我在 collectionView 单元格中有一个带有手势识别器的标签。当用户触摸标签时,我希望 pickerView 的外观类似于将 pickerView 附加到 textField 时的外观。

我试过了myLabel.inputView = pickerView

我在下面遇到了这个错误。

Cannot assign to property: 'inputView' is a get-only property

我遇到了一些线程,其中人们隐藏和取消隐藏 pickerView,而不是像它在 textField 中那样弹出和降低,但没有人解释为什么他们 hid/unhid 它。

如何从 UILabel 触发 PickerView?

请注意,我不想 hide/unhide 它像我阅读的其他答案一样。

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")
    }
}

我找到了答案。

在评论中 @AshlyMills 说我无法从 UILabel 触发选择器视图的原因是:“这是不可能的,因为 inputView 是 UIResponder属性 上的唯一获取"

我的解决方法是使用 UITextField 并明确说明。我将 pickerView 作为 inputView 添加到 textFiled。我将它直接放在标签上,按下它,pickerView 从底部模态出现,标签仍然可见。我删除了手势识别器,因为它不是必需的。

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
    }
}

如前所述,属性: 'inputView' 是 UILabelView 上的一个 get-only。

如果您坚持点击一个标签来获得您的 pickerView,在情节提要中,您需要在视图中使用一个固定的 UIPickerView,并在点击标签时为视图设置动画(而不是 hiding/unhiding)。