如何创建带有子菜单的汉堡包菜单

Naq*_*med 1 ios swift hamburger-menu

我正在开发一个应用程序,其中要求创建一个包含子菜单的汉堡包菜单,例如像这样

我尝试使用表格视图单元格内的表格等不同的方法,但无法创建此菜单。如果有人有解决方案,请推荐我

Aam*_*irR 5

您可以创建这样的项目结构作为您的数据源

struct Item {
    let text: String
    var subItems: [String]?
    var isExpanded = false
    init(_ text: String, items: [String]? = nil) {
        self.text = text
        self.subItems = items
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet var tableView: UITableView!

    private let imgOpen = UIImage(named: "open")
    private let imgClose = UIImage(named: "close")

    private var dataSource = [Item]()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "groupCell")
        self.tableView.dataSource = self
        self.tableView.delegate = self

        self.dataSource.append(Item("HOME"))
        self.dataSource.append(Item("ABOUT US"))
        self.dataSource.append(Item("OUR PROJECTS", items: ["Project-1", "Project-2", "..."]))
        self.dataSource.append(Item("BAHRIA TOWN PHASE 1 - 7"))
        self.dataSource.append(Item("BAHRIA TOWN PHASE 8"))
        self.tableView.reloadData()
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return self.dataSource.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let item = self.dataSource[section]
        if item.isExpanded, let count = item.subItems?.count {
            return count + 1
        }

        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let item = self.dataSource[indexPath.section]

            let cell = tableView.dequeueReusableCell(withIdentifier: "groupCell", for: indexPath)
            var imageView: UIImageView?
            if indexPath.row > 0, let text = item.subItems?[indexPath.row - 1] {
                cell.textLabel?.text = text
            } else {
                cell.textLabel?.text = item.text
                if item.subItems != nil {
                    imageView = UIImageView(image: item.isExpanded ? self.imgClose : self.imgOpen)
                }
            }
            cell.accessoryView = imageView

            return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let item = self.dataSource[indexPath.section]
        if indexPath.row == 0 && item.subItems != nil {
            self.dataSource[indexPath.section].isExpanded = !item.isExpanded
            let indexSet = IndexSet(integer: indexPath.section)
            tableView.reloadSections(indexSet, with: .automatic)
        } else {
            // non-expandable menu item tapped
        }
    }
}
Run Code Online (Sandbox Code Playgroud)