UIImageView isUserInteractionEnabled = true не работает - PullRequest
0 голосов
/ 30 января 2019

Следующий класс 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
    }
}

1 Ответ

0 голосов
/ 30 января 2019

Не уверен, что я что-то пропустил в вашем коде, но вам нужно добавить какое-то действие к изображению, включив userInteractionEnabled, чтобы он не распознавал нажатия на элемент и что делать, когда это происходит.Вам нужно добавить UITapGestureRecogniser к UIImageView

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 внизу, вам нужно сделать то, что вы пытались сделать наоборот ... вам нужно установить userInteractionEnabled в false на UIImageView

fieldIcon.isUserInteractionEnabled = false
...