У меня есть UITableView
, который встроен в UIView
, выступая в качестве раскрывающегося списка (см. Изображение).Однако он не реагирует на прикосновения пользователя ячейки (тестирование с использованием функции didSelectRowAtIndexPath
).Пожалуйста, см. Код ниже.
Как это работает, это то, что выпадающий список состоит в том, что он является подпредставлением кнопки (которая находится в статическом UITableViewCell
), так что при нажатии кнопки, выпадающий видвысота изменяется с 0
на 88
(и высота ячейки тоже изменяется).
Я проверил иерархию представления, и ничто не мешает представлению зарегистрировать касание.
Пользовательский класс раскрывающегося списка
class GenderDropDownView: UIView, UITableViewDelegate, UITableViewDataSource {
var genders = ["male.", "female."]
var tableView = UITableView()
override init(frame: CGRect) {
super.init(frame: frame)
self.layer.cornerRadius = 6
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
tableView.delegate = self
tableView.dataSource = self
self.addSubview(tableView)
// Table View constraints
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
tableView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
tableView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
tableView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
// Table view design
tableView.backgroundColor = .clear
tableView.separatorStyle = .none
tableView.allowsSelection = true
tableView.isUserInteractionEnabled = true
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = genders[indexPath.row]
cell.textLabel?.font = UIFont.systemFont(ofSize: 16, weight: .medium)
cell.textLabel?.textColor = .white
cell.textLabel?.textAlignment = .center
cell.backgroundColor = .clear
cell.selectionStyle = .none
cell.isUserInteractionEnabled = true
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(genders[indexPath.row])
}
}
Настройка раскрывающегося представления в родительском UITableViewController
func genderDropdownViewConfig() {
genderDropdownView.backgroundColor = Constants.azureColor
genderDropdownView.frame = CGRect(x: 0, y: 0, width: 0, height: 0)
genderDropdownView.translatesAutoresizingMaskIntoConstraints = false
genderDropdownButton.addSubview(genderDropdownView)
genderDropdownButton.addSubview(genderDropdownView)
tableView.bringSubview(toFront: genderDropdownView)
genderDropdownView.topAnchor.constraint(equalTo: genderDropdownButton.bottomAnchor).isActive = true
genderDropdownView.centerXAnchor.constraint(equalTo: genderDropdownButton.centerXAnchor).isActive = true
genderDropdownView.widthAnchor.constraint(equalTo: genderDropdownButton.widthAnchor).isActive = true
//genderDropdownHeight = genderDropdownView.heightAnchor.constraint(equalToConstant: 0)
genderDropdownHeight = genderDropdownView.heightAnchor.constraint(equalToConstant: 0)
for subview in genderDropdownView.subviews {
subview.backgroundColor = .clear
}
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let heights = [280, 130, 103, 103, 103, 103]
if indexPath.row == 2 && genderIsOpen == true {
return 191
} else {
return CGFloat(heights[indexPath.row])
}
}
@objc func genderDropDownTouched() {
if genderIsOpen == false {
NSLayoutConstraint.deactivate([self.genderDropdownHeight])
genderDropdownHeight.constant = 88
genderIsOpen = true
NSLayoutConstraint.activate([self.genderDropdownHeight])
// Editing height of cell
tableView.reloadData()
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {
self.genderDropdownView.layoutIfNeeded()
self.genderDropdownView.center.y += self.genderDropdownView.frame.height / 2
}, completion: nil)
} else {
NSLayoutConstraint.deactivate([self.genderDropdownHeight])
genderDropdownHeight.constant = 0
genderIsOpen = false
NSLayoutConstraint.activate([self.genderDropdownHeight])
// Editing height of cell
tableView.reloadData()
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {
self.genderDropdownView.center.y -= self.genderDropdownView.frame.height / 2
self.genderDropdownView.layoutIfNeeded()
}, completion: nil)
}
}