返回 导航

Swift

hangge.com

Swift - 第三方侧栏菜单组件SideMenu使用详解4(全局配置1:基础功能、样式)

作者:hangge | 2019-03-22 08:10
    通过 SideMenuManager.default 的各种配置属性,我们可以对 SideMenu 的各个功能特性进行全局设置。

五、菜单基本功能的全局配置

1,通过边缘滑动展开侧栏菜单

(1)在之前的文章中我们都是通过点击一个按钮来展开侧栏菜单,下面代码高亮部分增加边缘滑动打开菜单功能。
import UIKit
import SideMenu

// 主视图控制器
class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 定义一个侧栏菜单
        let menu = UISideMenuNavigationController(rootViewController: MenuViewController())
        menu.isNavigationBarHidden = true //侧栏菜单不显示导航栏
        // 将其作为默认的右侧菜单
        SideMenuManager.default.menuLeftNavigationController = menu
        
        // 开启通过边缘滑动打开侧栏菜单的功能
        SideMenuManager.default.menuAddPanGestureToPresent(toView:
            self.navigationController!.navigationBar)
        SideMenuManager.default.menuAddScreenEdgePanGesturesToPresent(toView:
            self.navigationController!.view)
    }
}

(2)运行结果如下:
  • 虽然主界面上没有菜单按钮,但我们可以通过手指在屏幕左侧边缘向右滑动来打开侧栏菜单。
  • 展开的程度根据滑动距离实时变化。
             

2,阻止菜单出现时,状态栏变黑

   从上面的效果图中可以看到,当侧栏菜单出现时,顶部的状态栏背景也会随之逐渐变黑。我们可以通过 menuFadeStatusBar 属性将其关闭,效果如下:
// 阻止状态栏背景变黑
SideMenuManager.default.menuFadeStatusBar = false

3,侧栏菜单的展示形式

(1)通过 menuPresentMode 属性可以改变侧栏菜单相对于当前视图的展示形式,有如下 4 种可选值:
  • menuSlideIn:菜单从外部滑入,覆盖在当前视图上。
  • viewSlideOut:当前视图向外滑出,露出下方的菜单(默认值)
  • viewSlideInOut:当前视图向外滑出,下方的菜单同步滑入。
  • menuDissolveIn:当前视图不动,菜单逐渐显示出来覆盖在当前视图上。

(2)下面是将其设置为 menuSlideIn 的效果:
              
// 菜单从外部滑入,覆盖在当前视图上。
SideMenuManager.default.menuPresentMode = .menuSlideIn

4,修改侧栏宽度

(1)默认情况下侧栏宽度是屏幕宽度的 75%,我们可以通过 menuWidth 属性对其进行修改。比如下面改成屏幕宽度的一半:
// 将侧栏宽度设置为屏幕宽度的一半
let screenWidth = UIScreen.main.bounds.width // 屏幕宽度
let screenHeight = UIScreen.main.bounds.height  // 屏幕高度
SideMenuManager.default.menuWidth = round(min(screenWidth, screenHeight) * 0.5)

(2)上面是对所有菜单进行全局的设置,我们还是可以通过 UISideMenuNavigationController 对象的 menuWidth 属性来单独对某个菜单宽度进行设置。
// 定义一个侧栏菜单
let menu = UISideMenuNavigationController(rootViewController: MenuViewController())
menu.menuWidth = 100
SideMenuManager.default.menuLeftNavigationController = menu

5,菜单与主视图之间的阴影透明度

默认情况下阴影透明度为 0.5,下面将其设置为 0(即不显示阴影)
// 将阴影透明度设为0
SideMenuManager.default.menuShadowOpacity = 0

6,菜单与主视图之间的阴影颜色

// 阴影颜色
SideMenuManager.default.menuShadowColor = .orange

7,阴影半径(阴影距离)


// 阴影距离
SideMenuManager.default.menuShadowRadius = 20

8,当新视图 push 进来时,当前显示的菜单行为

(1)默认情况下,如果侧栏菜单正在显示,这时 push 一个新视图进来,侧栏菜单会自动关闭。我们可以设置如下属性使其不自定关闭:
// 新视图进来时,菜单不自动隐藏 
SideMenuManager.default.menuDismissOnPush = false

(2)默认情况下,如果新视图 push 进行时,侧栏菜单自动关闭时没有动画效果的。我们可以设置如下属性使仍有动画效果:
// 新视图进来时,菜单隐藏过程由动画效果
SideMenuManager.default.menuAlwaysAnimate = true

9,同时存在多种菜单样式

(1)如果 App 种只存在一个侧栏菜单,或者一种样式的侧栏菜单,我们直接使用 SideMenuManager.default 来设置全局样式即可。
(2)如果 App 里需要多种不同的样式侧栏菜单时,我们可以创建多个 SideMenuManager 实例化对象来使用。比如下面样例,左侧菜单和右侧菜单使用完全不一样的配置:
          
import UIKit
import SideMenu

// 主视图控制器
class ViewController: UIViewController {
    
    // 左侧菜单控制器
    let leftSideMenuManager = SideMenuManager()
    // 右侧菜单控制器
    let rightSideMenuManager = SideMenuManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 定义左侧栏菜单
        let leftMenu = UISideMenuNavigationController(rootViewController: MenuViewController())
        leftMenu.isNavigationBarHidden = true //侧栏菜单不显示导航栏
        leftSideMenuManager.menuShadowColor = .red  // 阴影为红色
        leftSideMenuManager.menuLeftNavigationController = leftMenu
        
        // 定义右侧栏菜单
        let rightMenu = UISideMenuNavigationController(rootViewController: MenuViewController())
        rightMenu.isNavigationBarHidden = true //侧栏菜单不显示导航栏
        rightSideMenuManager.menuShadowColor = .green  // 阴影为绿色
        rightSideMenuManager.menuRightNavigationController = rightMenu
    }
    
    // 显示左侧菜单
    @IBAction func showLeftMenu(_ sender: Any) {
        // 显示侧栏菜单
        self.present(leftSideMenuManager.menuLeftNavigationController!, animated: true,
                     completion: nil)
    }
    
    // 显示右侧菜单
    @IBAction func showRightMenu(_ sender: Any) {
        // 显示侧栏菜单
        self.present(rightSideMenuManager.menuRightNavigationController!, animated: true,
                     completion: nil)
    }
}
评论

全部评论(0)

回到顶部