LABMenu 0.2

LABMenu 0.2

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最新发布2017年11月
SwiftSwift版本4
SPM支持SPM

Leonardo Armero Barbosa 维护。



  • 作者:
  • Leonardo Armero Barbosa和Luis Alejandro Barbosa Lee

LABMenu

简单的左侧菜单。只需创建您的自定义视图并放入其中。

要求

要求

  • iOS 10.0+
  • Xcode 9.0+
  • Swift 4.0+

安装

CocoaPods

安装CocoaPods,如果尚未安装

$ [sudo] gem install cocoapods
$ pod setup

转到Xcode项目的目录,创建并编辑Podfile,并添加LabMenu

$ cd /path/to/MyProject
$ nano Podfile

platform :ios, '11.0'
use_frameworks!

target 'MyProject' do
 pod 'LABMenu', :git => 'https://github.com/xrax/LABMenu.git'
end

将其安装在您的项目中

$ pod install

从.xcworkspace文件打开您的项目(不要使用常规的项目文件)

$ open MyProject.xcworkspace

现在您可以在文件中导入LABMenu框架。

使用方法

为了使用此pods,您需要了解一下。

您需要一个ViewController作为容器,其中包含所有这些pods的工作。

此容器需要一些东西才能工作
(* 继承自LABMenuViewController。
* 在调用super.viewDidLoad()之前设置menuView属性。
* 创建一个自定义菜单继承自LABMenuContainer。
* 通过调用menuView.setContentView(contentView:)函数设置您的自定义菜单为contentView。
* 使用UIBarButtonItem或仅使用图像设置您的自定义菜单按钮。
*(可选)使用UIBarButtonItem设置您的自定义后退按钮。如果您没有,将显示默认的"<"。
使用pushViewController()函数在容器ViewController中推送您的viewControllers。

从这个点开始,LABMenu内的所有viewControllers都在一个"internalNavigationController"内部,但所有在LABMenu之外的viewControllers都在与您的容器ViewController相同的navigationController中。

例如,viewControllers层次结构应该看起来像:

  • NavigationController
    • LauncherViewController
    • LoginViewController
    • ContainerViewController
      • internalNavigationController
        • HomeViewController
        • ProfileViewController

该项目有4个屏幕:Launcher、Login、Home和Profile。只有Home和Profile在容器中。

  • 一步一步来!

创建您自定义的菜单视图。例如(从xib加载)

xib file

为您的菜单创建一个swift文件。从"LABMenuContainer"继承。将文件所有者类设置为该菜单类。

Files Owner
Setting Class

实现所需的init和重写'init(delegate: LABMenuContainerDelegate)'。在重写的init中调用'super.init(delegate:)'并使用'Bundle.main.loadNibNamed'函数调用您的xib。设置根视图并实现菜单中所需的所有方面和功能。

import UIKit
import LABMenu

class MyMenu: LABMenuContainer {
    
    fileprivate let sections: [String] = ["Main", "Options"]
    fileprivate let items: [[String]] = [["Home", "Profile"], ["Settings", "Options"]]
    
    @IBOutlet var view: UIView!
    @IBOutlet weak var icUser: UIImageView!
    @IBOutlet weak var icUserName: UILabel!
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override init(delegate: LABMenuContainerDelegate) {
        super.init(menuProportionalWidth: 0.8, delegate: delegate)
        Bundle.main.loadNibNamed("MyMenu",
                                 owner: self,
                                 options: nil)
        
        self.view!.frame = CGRect(origin: CGPoint.zero,
                                  size: frame.size)
        self.addSubview(self.view!)
        
        self.delegate = delegate
    }
    
    @IBAction func closeSession(_ sender: Any) {
        NSLog("Session closed")
    }
}

extension MyMenu: UITableViewDataSource, UITableViewDelegate {
    func numberOfSections(in tableView: UITableView) -> Int {
        return items.count
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items[section].count
    }
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return sections[section]
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default,
                                   reuseIdentifier: nil)
        
        cell.textLabel!.text = items[indexPath.section][indexPath.row]
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        delegate.selectItemAt(indexPath: indexPath)
    }
}

注意在super.init调用中有一个menuProportionalWidth参数,它允许的值在0到1之间。该值应在以下LABMenuViewController构造函数中设置。

在您的Storyboard中,将“ContainerViewController”嵌入到NavigationController中,并创建所需的所有视图控制器。

storyboard

然后从'LABMenuViewController'继承“ContainerViewController”,并重写viewDidLoad。您可以调用super.viewDidLoad()之前设置所有LABMenuController属性。

class ViewController: LABMenuViewController {

	override func viewDidLoad() {
        // menuView properties
        barColor = .lightGray
        barTintColor = .white
        menuProportionalWidth = 0.8
        hideMenuButtonWhenShow = true
        backPosition = .left

        super.viewDidLoad()
    }
}
  • barColor:设置导航栏颜色,也可以更改状态栏风格。如果需要特定的状态栏样式,应在调用super.viewDidLoad()之后设置它。
  • barTintColor:设置导航栏项的色调。
  • menuProportionalWidth:允许的值为0到1。表示相对于屏幕的比例宽度。该值应与上面LABMenuContainer的super.init()调用中设置相同。
  • hideMenuButtonWhenShow:如果您想在菜单打开时隐藏菜单按钮,将其设置为true。
  • backPosition:设置返回按钮的位置。如果是.left,则在出现不同的viewController(非根控制器)时,将替换菜单按钮为返回按钮。

在viewDidLoad函数中您必须设置您的Menu类

	override func viewDidLoad() {
        // menuView properties
        barColor = .lightGray
        barTintColor = .white
        menuProportionalWidth = 0.8
        hideMenuButtonWhenShow = true
        backPosition = .left

        super.viewDidLoad()
        
        menuView.setContentView(contentView: MyMenu(delegate: self))
        // Just set the image in the Menu BarButtonItem
        setMenuButton(image: #imageLiteral(resourceName: "icMenu"))
        // Or this to set a customized BarButtonItem
        setMenuButton(button: UIBarButtonItem(customView: myCustomizedView))
        // You can set the image in the BackButton else it show a simple '<'
        setBackButton(button: #imageLiteral(resourceName: "icBackButton"))
        
        let homeViewController = self.storyboard!.instantiateViewController(withIdentifier: "HomeViewController")
        self.pushViewController(homeViewController,
                                animated: true)
    }
  • 使用您的自定义菜单视图调用setContentView(contentView)
  • 调用setMenuButton(image:)以设置您的菜单按钮图像。
  • 调用setMenuButton(button:)以使用自定义菜单按钮。
  • 调用setBackButton(button:)以使用您的返回按钮图像。
  • 实例化第一个ViewController并将其推入。

home
menu
profile
nmenu

注意事项

  • 您必须创建一个ViewController作为containerViewController。然后您必须使用pushViewController函数将新的viewController推入LABMenuContainer,或使用onBackClick返回前一个页面。
  • 如果您要添加菜单按钮,必须在containerViewController中调用setMenuButton函数。
  • 在使用pushViewController函数时,您必须在使用containerViewController中添加第一个(根)viewController。
  • LABMenuContainer会验证要推入的viewController是否不在当前队列中。所有viewController都必须有一个viewController类作为所有者。

贡献

我们欢迎所有贡献。请联系我们。

联系方式

Leonardo Armero Barbosa

许可(MIT)

MIT许可

版权(c)2017 Leonardo Armero Barbosa

特此授予任何人,免费,以任何方式复制或分发此软件及其相关文档文件(“软件”),用于软件的任何处理,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售拷贝的软件,并允许获得软件的人这样做,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。
版权所有 (C) 2017 Leonardo Armero Barbosa
特此授予任何人,免费,以任何方式复制或分发此软件及其相关文档文件(“软件”),用于软件的任何处理,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售拷贝的软件,并允许获得软件的人这样做,前提是遵守以下条件
本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。

本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。
本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。

本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。
本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。
本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。
本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。
本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。
本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。
本软件按“原样”提供,没有任何形式的明示或暗示的保证,包括但不仅限于适用性、针对特定目的的适宜性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他责任,是否因软件或使用或其它方式使用软件而引起,或与之相关。