2017-03-09 12 views
-1

スライドビューメニューで同じビューでテーブルビューを作成する際に問題が発生しました。これを行う方法を教えてください。ビューコントローラと埋め込みナビゲーションコントローラを作成しました。スライドメニューの背後にあり、1つのカスタムセルで2つのセクションとデータを表示するテーブルビューを表示します。swift 3テーブルビューとスライドアウトメニュー

enter image description here

+1

以下のようにデリゲートを追加し、あなたのページの名前がダッシュボードでみましょう。 https://www.cocoacontrols.com/search?q=sidemenu –

+1

[半画面表示、iOSサイドバーメニュー]の可能な複製(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 /)を使用して、[サイドメニュー](https://github.com/jonkykong/SideMenu)も同様に役立ちます –

答えて

0

@Egle Matutyte、私はあなたがスライドバーを除くすべての作業を行っていると仮定しています。 SlideBarのコードを提供しています。追加して試してみてください。

まず、そのままの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) 
    } 
} 

は今のコードを貼り付け継承する新しい迅速なクラスを追加

SideBarTableViewController 

をこの後

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

を以下のサイドバーのクラス、すなわちを追加しますあなたのTableViewControllerまたはSlideBarを追加したいページの下に表示されます。

それについてのチュートリアルのトンがあるios`に `サイドメニューとしてGoogleを検索してください

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 
     } 
    } 
} 
関連する問題