快速3表视图与滑出菜单

时间:2017-03-09 06:36:33

标签: swift uitableview

我在使用幻灯片菜单在同一视图上制作表格视图时遇到问题,你能帮我怎么做,我创建了视图控制器和嵌入式导航控制器,现在我只想在幻灯片菜单后面添加表格并显示表格查看两个部分并使用一个自定义单元格显示数据。

enter image description here

1 个答案:

答案 0 :(得分:1)

@Egle Matutyte,我想你已经做了除SlideBar以外的所有工作。 我正在为SlideBar提供代码。只需添加并尝试。

首先添加SideBar类,即下面没有任何更改

import UIKit

@objc protocol SideBarDelegate{
    func sideBarDidSelectButtonAtIndex(_ index:Int)
    @objc optional func sideBarWillClose()
    @objc optional func sideBarWillOpen()
}

class SideBar: NSObject, SideBarTableViewControllerDelegate {

    let barWidth:CGFloat = 150.0
    let sideBarTableViewTopInset:CGFloat = 64.0
    let sideBarContainerView:UIView = UIView()
    let sideBarTableViewController:SideBarTableViewController =       SideBarTableViewController()
    var originView:UIView = UIView()

    var animator:UIDynamicAnimator!
    var delegate:SideBarDelegate?
    var isSideBarOpen:Bool = false

    override init() {
        super.init()
    }

    init(sourceView:UIView, menuItems:Array<String>){
        super.init()
        originView = sourceView
        sideBarTableViewController.tableData = menuItems

        setupSideBar()

        animator = UIDynamicAnimator(referenceView: originView)

        let showGestureRecognizer:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(SideBar.handleSwipe(_:)))
        showGestureRecognizer.direction = UISwipeGestureRecognizerDirection.right
        originView.addGestureRecognizer(showGestureRecognizer)

        let hideGestureRecognizer:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(SideBar.handleSwipe(_:)))
        hideGestureRecognizer.direction = UISwipeGestureRecognizerDirection.left
        originView.addGestureRecognizer(hideGestureRecognizer)
    }


    func setupSideBar(){
        //sideBarContainerView.frame = CGRect(x: -barWidth - 1, y: originView.frame.origin.y, width: barWidth, height: originView.frame.size.height)

        sideBarContainerView.frame = CGRect(x: -barWidth - 1, y: sideBarTableViewTopInset, width: barWidth, height: originView.frame.size.height)

        sideBarContainerView.backgroundColor = UIColor.clear
        sideBarContainerView.clipsToBounds = false

        originView.addSubview(sideBarContainerView)

        let blurView:UIVisualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffectStyle.light))
        blurView.frame = sideBarContainerView.bounds
        sideBarContainerView.addSubview(blurView)


        sideBarTableViewController.delegate = self
        sideBarTableViewController.tableView.frame = sideBarContainerView.bounds
        sideBarTableViewController.tableView.clipsToBounds = false
        sideBarTableViewController.tableView.separatorStyle = UITableViewCellSeparatorStyle.none
        sideBarTableViewController.tableView.backgroundColor = UIColor.clear
        sideBarTableViewController.tableView.scrollsToTop  = false
        //sideBarTableViewController.tableView.contentInset = UIEdgeInsetsMake(sideBarTableViewTopInset, 0, 0, 0)
        sideBarTableViewController.tableView.contentInset = UIEdgeInsetsMake(1, 0, 0, 0)
        sideBarTableViewController.tableView.reloadData()

        sideBarContainerView.addSubview(sideBarTableViewController.tableView)
    }


    func handleSwipe(_ recognizer:UISwipeGestureRecognizer){
        if recognizer.direction == UISwipeGestureRecognizerDirection.left{
            showSideBar(false)
            delegate?.sideBarWillClose?()
        }else{
            showSideBar(true)
            delegate?.sideBarWillOpen?()
        }
    }


    func showSideBar(_ shouldOpen:Bool){
        animator.removeAllBehaviors()
        isSideBarOpen = shouldOpen

        let gravityX:CGFloat = (shouldOpen) ? 0.5 : -0.5
        let magnitude:CGFloat = (shouldOpen) ? 20 : -20
        let boundaryX:CGFloat = (shouldOpen) ? barWidth : -barWidth - 1


        let gravityBehavior:UIGravityBehavior = UIGravityBehavior(items: [sideBarContainerView])
        gravityBehavior.gravityDirection = CGVector(dx: gravityX, dy: 0)
        animator.addBehavior(gravityBehavior)

        let collisionBehavior:UICollisionBehavior = UICollisionBehavior(items: [sideBarContainerView])
        collisionBehavior.addBoundary(withIdentifier: "sideBarBoundary" as NSCopying, from: CGPoint(x: boundaryX, y: 20), to: CGPoint(x: boundaryX, y: originView.frame.size.height))
        animator.addBehavior(collisionBehavior)

        let pushBehavior:UIPushBehavior = UIPushBehavior(items: [sideBarContainerView], mode: UIPushBehaviorMode.instantaneous)
        pushBehavior.magnitude = magnitude
        animator.addBehavior(pushBehavior)


        let sideBarBehavior:UIDynamicItemBehavior = UIDynamicItemBehavior(items: [sideBarContainerView])
        sideBarBehavior.elasticity = 0.3
        animator.addBehavior(sideBarBehavior)
    }

    func sideBarControlDidSelectRow(_ indexPath: IndexPath) {
        delegate?.sideBarDidSelectButtonAtIndex(indexPath.row)
        showSideBar(false)
    }
}

在此之后,添加一个新的快速类

SideBarTableViewController 

继承UITableViewController

import UIKit

protocol SideBarTableViewControllerDelegate{
    func sideBarControlDidSelectRow(_ indexPath:IndexPath)
}

class SideBarTableViewController: UITableViewController {

    var delegate:SideBarTableViewControllerDelegate?
    var tableData:Array<String> = []

    override func viewDidLoad() {
        super.viewDidLoad()
    }


    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tableData.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        var cell:UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "Cell")

        if cell == nil {
            cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
            cell!.backgroundColor = UIColor.clear
            cell!.textLabel?.textColor = UIColor.darkText

            let selectedView:UIView = UIView(frame: CGRect(x: 0, y: 0, width: cell!.frame.size.width, height: cell!.frame.size.height))
            selectedView.backgroundColor = UIColor.black.withAlphaComponent(0.3)

            cell!.selectedBackgroundView = selectedView
        }

        cell!.textLabel?.text = tableData[indexPath.row]

        return cell!
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 45
    }


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        delegate?.sideBarControlDidSelectRow(indexPath)
    }
}

现在将下面的代码粘贴到TableViewController或要添加SlideBar的页面中。

让页面名称为Dashboard,添加代理如下

class Dashboard: UIViewController, SideBarDelegate
{
  //declare sidebar
    var sideBar:SideBar = SideBar()

    override func viewWillAppear(_ animated: Bool)
    {
        //Initialise the content of SlideBar Row
        sideBar = SideBar(sourceView: self.view, menuItems: ["Home", "Dashboard"])
        sideBar.delegate = self
    }

    func sideBarControlDidSelectRow(_ indexPath: IndexPath) {
        print("Selected from SlideBar")
    }

    func sideBarDidSelectButtonAtIndex(_ index: Int)
    {
        //
    }
    //Add a button(Optional)in ViewDidLoad()
    override func viewDidLoad()
    {
        super.viewDidLoad()

         let btn_Hamburger = UIButton(frame: CGRect(x: 10, y: 70,    width: 100, height: 25))
         btn_Hamburger.addTarget(self, action: #selector(btn_hamburger(sender:)), for: .touchUpInside)
         //add Image on Hamburger button
         btn_Hamburger.setImage(#imageLiteral(resourceName: "img_hemberger"), for: .normal)
         view.addSubview(btn_Hamburger)
    }
     //To in and out SideBar menu
    var flag:Bool = true
    func btn_hamburger(sender: UIButton!)
    {
        if flag == true {
            sideBar.showSideBar(true)
            flag = false
        }
        else{
            sideBar.showSideBar(false)
            flag = true
        }
    }
}