2017-03-09 78 views
-1

我在幻灯片菜单的相同视图上制作表格视图时遇到问题,您能否帮助我如何做到这一点,我创建了视图控制器和嵌入式导航控制器,现在我只想添加表格在幻灯片菜单后面展开,并用两个部分显示表格视图,并用一个自定义单元显示数据。swift 3 table view with slide out menu

enter image description here

+1

请搜索谷歌为'侧边菜单ios'有吨关于它的教程。 https://www.cocoacontrols.com/search?q=sidemenu –

+1

[Half screen view,iOS Sidebar Menu]可能的重复(http://stackoverflow.com/questions/14352342/half-screen-view-ios-sidebar - 菜单) –

+0

查看[SWRevealViewController](https://github.com/John-Lluch/SWRevealViewController),这里是[一个有用的教程](http://www.appcoda.com/ios-programming-sidebar-navigation -menu /)关于如何使用它,[Side Menu](https://github.com/jonkykong/SideMenu)也应该对你有所帮助 –

回答

0

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

首先添加即低于侧栏类没有任何改变

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的页面下面。

让你的页面的名称是仪表板,添加代理如下

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 
     } 
    } 
}