【发布时间】:2021-04-01 08:03:30
【问题描述】:
我制作了一个自定义 UIButton,其中包含一个折叠 UITableView。一旦您点击按钮,表格视图高度约束就会更改,并且表格视图会以折叠效果打开。 我设法为提供表数据的按钮创建了委托,但我无法获取 didSelectRow 并滚动 tableView。我认为这可能与 tableView 折叠时需要放大按钮框架有关,但我没有设法这样做。
这是自定义 UIButton:
CollapseButton.swift
Created by Matan Levi on 21/12/2020.
import UIKit
protocol CollapseButtonDelegate
{
var options : [String] { get }
func didSelectRow(tableView: UITableView, indexPath: IndexPath)
}
@IBDesignable class CollapseButton: UIButton {
@IBOutlet weak var btnTableViewOutlet: UITableView!
@IBOutlet weak var btnCollapseHeight: NSLayoutConstraint!
let open = CGFloat(113)
let close = CGFloat.zero
var isOpen = false
var delegate : CollapseButtonDelegate?
// init used if the view is created programmatically
override init(frame: CGRect) {
super.init(frame: frame)
self.customInit()
}
// init used if the view is created through IB
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.customInit()
}
override func awakeAfter(using aDecoder: NSCoder) -> Any? {
guard subviews.isEmpty else { return self }
let view = UINib(nibName: "CollapseButton", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
view.translatesAutoresizingMaskIntoConstraints = false
return view
}
// Do custom initialization here
private func customInit()
{
}
@IBAction func collapseBtn(_ sender: UIButton) {
self.btnTableViewOutlet.addBorder()
UIView.animate(withDuration: 1) {
self.btnCollapseHeight.constant = self.isOpen ? self.close : self.open
sender.imageView?.transform = self.isOpen ? CGAffineTransform.identity : CGAffineTransform(rotationAngle: .pi)
self.layoutIfNeeded()
}
isOpen = !isOpen
}
}
extension CollapseButton : UITableViewDelegate, UITableViewDataSource
{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return delegate?.options.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
cell.textLabel?.text = delegate?.options[indexPath.row]
cell.backgroundColor = .green
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
delegate?.didSelectRow(tableView: tableView, indexPath: indexPath)
}
}
下面是按钮的实现:
extension PortfolioViewController : CollapseButtonDelegate
{
func didOpenCollapse() {
accountBtnOutlet.setNeedsUpdateConstraints()
accountBtnOutlet.addBorder()
}
var options: [String] {
return FakeDataSupplier.shared.getAccountsData()
}
func didSelectRow(tableView: UITableView, indexPath: IndexPath) {
print(indexPath.row)
}
}
我试过了:
1.检查用户交互启用 2.检查委托和数据源是否连接 3.在ui调试器中检查UITableView上方没有任何东西
任何建议将不胜感激
编辑
添加截图:
【问题讨论】:
-
用户如何将表格视图折叠回关闭?
-
再次按下按钮,将 uitableview 高度常数更改为零
-
那么如果完全包含表格视图的按钮正在消耗触摸,用户如何选择一行?
-
用户可以从按钮下打开的表格视图中选择一行
-
@Matan - 以这种方式将子视图添加到
UIButton是不寻常的,而且如果不了解您的 xib 设置,很难给您一个可行的答案。但是,问题是您的 tableView 扩展了 按钮的边界之外...要与之交互,您需要实现hitTest(,,,)。看看这个答案:stackoverflow.com/a/56755795/6257435——类似的问题,但使用的是 textField 而不是按钮。如果您无法在课堂上实现这一点,请使用您的 xib 详细信息更新您的问题。
标签: ios swift uitableview uibutton xib