0

下面的DateField类有一个日期字段和一个图标。由于某种原因fieldIcon.isUserInteractionEnabled = true,影响为零,并且不会将用户点击传递到该字段。我错过了什么吗?

import UIKit
import SnapKit

protocol DateFieldDelegate: class {
    func dateSelected(_ dateField: DateField, date: Date)
}

class DateField: UIView, UITextFieldDelegate {

    weak var delegate: DateFieldDelegate?
    let field = UITextField()
    private var datePicker: UIDatePicker?

    convenience init(withStartDate startDate: Date) {
        self.init()

        datePicker = prepareDatePicker()
        guard let datePicker = datePicker else { return }
        field.inputView = datePicker
        field.delegate = self

        addSubview(field)
        field.snp.makeConstraints { make in
            make.top.equalToSuperview()
            make.leading.equalToSuperview()
            make.trailing.equalToSuperview()
            make.height.equalTo(37)
            make.bottom.equalToSuperview()
        }

        let fieldIcon = UIImageView(image: UIImage(asset: Asset.calendar))
        field.addSubview(fieldIcon)
        fieldIcon.isUserInteractionEnabled = true  // doesn't work
        fieldIcon.snp.makeConstraints { make in
            make.width.equalTo(21)
            make.height.equalTo(23)
            make.trailing.equalToSuperview().offset(-10)
            make.centerY.equalToSuperview()
        }

        setStyle(.regular)
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        guard let date = datePicker?.date else { return }
        field.text = date.formatToString()
        delegate?.dateSelected(self, date: date)
    }

    private func prepareDatePicker() -> UIDatePicker {
        let datePicker = UIDatePicker()
        datePicker.datePickerMode = .date
        datePicker.setDate(Date(), animated: false)
        datePicker.locale = Language.appLocale()
        return datePicker
    }
}
4

1 回答 1

2

不确定我是否在您的代码中遗漏了某些内容,但您需要向图像添加某种操作,启用userInteractionEnabled不会告诉它识别项目上的点击以及发生这种情况时该怎么做。您需要UITapGestureRecogniserUIImageView

let fieldIcon = UIImageView(image: UIImage(asset: Asset.calendar))
field.addSubview(fieldIcon)
fieldIcon.isUserInteractionEnabled = true  // doesn't work

let fieldIcon = UIImageView(image: UIImage(asset: Asset.calendar))
field.addSubview(fieldIcon)

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(calenderIconTapped))
fieldIcon.addGestureRecognisor(tapGesture)

func calenderIconTapped() {
    // show the picker
}

更新:

重新阅读您的问题后,我了解您现在尝试做什么。如果您希望图像视图上的任何点击都传递到UITextField下方,您需要执行与您尝试相反的操作...您需要设置userInteractionEnabledfalseUIImageView

fieldIcon.isUserInteractionEnabled = false
于 2019-01-30T13:28:38.637 回答