MMDrawerController(0.6.0) 文档翻译(简介,非API文档)

2023-11-07

Mutual Mobile Drawer Controller

随着使用抽屉效果的应用越来越多,MMDrawerController应运而生。MMDrawerController是一个仅支持侧边抽屉导航的轻量级库。同时库中还提供了定制展现、收缩抽屉导航栏动画的方法。

Documentation
官方的文档在CocoaDocs中可以找到。

Installing MMDrawerController
你可以使用CocoaPods在你的项目中安装MMDrawerController。

pod 'MMDrawerController', '~> 0.5.7'

Creating a Drawer Controller
创建一个MMDrawerController和创建一个中央视图控制器与抽屉视图控制器一样简单,然后再初始化抽屉。

UIViewController * leftDrawer = [[UIViewController alloc] init];
UIViewController * center = [[UIViewController alloc] init];
UIViewController * rightDrawer = [[UIViewController alloc] init];

MMDrawerController * drawerController = [[MMDrawerController alloc]
                                       initWithCenterViewController:center
                                           leftDrawerViewController:leftDrawer
                                           rightDrawerViewController:rightDrawer];

Features
UINavigationController Support
MMDrawerController可以无缝接受一个UINavigationController作为中心视图控制器(centerViewController),并且自动更新所支持的手势。总的来说,使用下面描述的分类,任何包含在UINavigationController中的子视图控制器可以访问父视图控制器。(我觉得翻译的有瑕疵,贴出原文: In addition, any child view controller contained within the UINavigationController will have access to the parent drawer controller using the category explained below.)

UIGestureRecongnizer Support
MMDrawerController通过两个掩码(一个用于打开,一个用于关闭)支持手势开关抽屉,选项如下:

  • MMOpenDrawerGestureMode
    • MMOpenDrawerGestureModePanningNavigationBar:用户可以通过拖拽导航条的任何地方来打开抽屉视图
    • MMOpenDrawerGestureModePanningCenterView:用户可以通过拖拽中央视图的任何地方来打开抽屉视图
    • MMOpenDrawerGestureModeBezelPanningCenterView:用户可以通过在任意地方开始,离边缘20个点位内拖拽来打开抽屉视图(原文:The user can open the drawer by starting a pan anywhere within 20 points of the bezel)
    • MMOpenDrawerGestureModeCustom:开发者可以提供一个回调函数(block)来决定手势是否可以被识别。更多信息请接着看。
  • MMCloseDrawerGestureMode
    • MMCloseDrawerGestureModePanningNavigationBar:用户可以通过拖拽导航条的任意地方来关闭抽屉视图
    • MMCloseDrawerGestureModePanningCenterView:用户可以通过拖拽中心视图的任意地方来关闭抽屉视图
    • MMCloseDrawerGestureModeBezelPanningCenterView:用户可以从中央视图的任意地方开始,在边缘之内拖拽来关闭抽屉视图(原文:The user can close the drawer by starting a pan anywhere within the bezel of the center view)
    • MMCloseDrawerGestureModeTapNavigationBar:用户可以通过点击导航条来关闭抽屉视图
    • MMCloseDrawerGesturePanningDrawerView:用户可以拖拽抽屉视图任意位置来关闭它
    • MMCloseDrawerGestureModeCustom:开发者可以提供一个回调函数(block)来决定是否接收手势。更多信息请接着看。

你可以自由的设置任何打开关闭抽屉视图的组合。不过请注意这些手势可能与发送到子视图控制器的点击冲突,所以请在你的应用中适当的使用手势。例如,如果一个MKMapView是你的中央视图,你可能不希望设置MMOpenDrawerGestureModePanningCenterView,因为那可能让MKMapView拦截这个拖拽,并以为那是在移动地图。

Custom Gesture Recognizer Support
从0.3.0版本开始,你可以使用setGestureShouldRecognizeTouchBlock:方法并提供一个回调函数(block)来决定一个手势是否可以被识别。这个方法提供了三个参数-抽屉视图,手势和点击(the drawer controller, the gesture, and the touch)。作为开发者,你有责任检验这三个参数,并且决定一个手势是否应该被识别。注意,如果你在相应的掩码中设置了MMOpenDrawerGestureModeCustom / MMCloseDrawerGestureModeCustom,回调函数(block)才会有效(原文:Note the block is only consulted if you have set MMOpenDrawerGestureModeCustom/MMCloseDrawerGestureModeCustom on the appropriate mask)。
比如,假设你的中心视图控制器包含一些元素,你只希望当拖拽手势的初始点击处在一个子视图中。你应该确保openDrawerGestureModeMask包含了MMOpenDrawerGestureModeCustom,并且你可以写如下的回调函数(block):

[myDrawerController
 setGestureShouldRecognizeTouchBlock:^BOOL(MMDrawerController *drawerController, UIGestureRecognizer *gesture, UITouch *touch) {
     BOOL shouldRecognizeTouch = NO;
     if(drawerController.openSide == MMDrawerSideNone &&
        [gesture isKindOfClass:[UIPanGestureRecognizer class]]){
         UIView * customView = [drawerController.centerViewController myCustomSubview];
         CGPoint location = [touch locationInView:customView];
         shouldRecognizeTouch = (CGRectContainsPoint(customView.bounds, location));
     }
     return shouldRecognizeTouch;
 }];

注意,你应该不会想让openDrawerGestureModeMask包含MMOpenDrawerGestureModePanningCenterView,因为那样会产生自动无视手势在中心视图中的起始点的效果(原文:since that would take over and be applied automatically regardless of where the touch begins within the center view)。

Custom Drawer Open/Close Animations
当抽屉视图打开或关闭效果被拖拽手势触发时,MMDrawerController提供了一个回调函数供开发者实现自己的动画效果。在回调函数(block)中,你有责任更新抽屉视图的视觉状态,同时,抽屉视图将会处理那个状态的动画。
比如,要在动画过程中设置抽屉视图侧边栏的alpha值时,你可以按照下面的实现方式:

[drawerController
     setDrawerVisualStateBlock:^(MMDrawerController *drawerController, MMDrawerSide drawerSide, CGFloat percentVisible) {
         UIViewController * sideDrawerViewController;
         if(drawerSide == MMDrawerSideLeft){
             sideDrawerViewController = drawerController.leftDrawerViewController;
         }
         else if(drawerSide == MMDrawerSideRight){
             sideDrawerViewController = drawerController.rightDrawerViewController;
         }
         [sideDrawerViewController.view setAlpha:percentVisible];
     }];

总的来说,MMDrawerController提供了一些过渡动画。这些动画被包含在MMDrawerController项目中的子项目里,详情请看文档(原文:In addition, MMDrawerController ships with several prebuilt animations to let you go crazy right out of the box. These are included as a subspec for the project, and more information can be found below)。

Center View COntroller Interaction Mode
当抽屉视图被打开时,你可以控制用户和中心视图控制器的交互方式。

  • MMDrawerOpenCenterInteractionModeNone:用户不能与中心视图的任何内容有交互。
  • MMDrawerOpenCenterInteractionModeFull:用户可以与中心视图的任何内容有交互。
  • MMDrawerOpenCenterInteractionModeNavigationBarOnly:用户只能与导航条中的内容交互。这个设置允许菜单按钮被响应,允许你在抽屉视图打开的时候让它关闭。上述都是默认设置。

Accessing the Drawer Controller from a Child View Controller
你可以使用UIViewController+MMDrawerController分类在子视图控制器中直接访问drawerController。

State Restoration
从0.4.0版本开始,MMDrawerController支持iOS状态恢复。为了让MMDrawerController使用state restoration选项,你必须为你的抽屉视图设置restorationIdentifier。如果你需要让MMDrawerController管理的三个视图都有恢复功能,你的centerViewController,leftDrawerViewController和rightDrawerViewController的实例必须设置它们自己的restorationIdentifier(创建一个restorationClass也是可以的)。如果你的应用被放在后台运行时MMDrawerController有一个打开的抽屉视图,那么程序切换到前台运行时这个状态也必须被恢复。

iOS 7 Status Bar Support
Child View Controller Support
从iOS7开始,默认情况下子视图控制器将决定status bar的状态,包括status bar的风格及它是否被隐藏。这些值将会在抽屉侧边栏状态改变时被更新,这意味着侧边抽屉视图会提供一个与中心视图不同的状态值。

如果你不希望抽屉视图会影响子视图控制器的这些状态,你应该继承MMDrawerController,覆盖childViewControllerForStatusBarStyle和childViewControllerForStatusBarHidden,并让它们都返回nil。

Custom Status Bar Background View
如果你的中心视图控制器和抽屉控制器颜色差异较大,iOS7的status bar的处理方式会让你的应用看起来跟想象的差距较大。从iOS7开始,MMDrawerController支持在屏幕顶部绘制定制的状态栏。为了提供给你一个能展示颜色差异大的状态栏,并且能在状态栏下面能显示你自定义的内容,请在iOS6.x以下版本使用上述设计。
为了使用自定义的status bar,设置showStatusBarBackgroundView为YES即可。默认情况下,这个设置会在status bar下面绘制一个黑色的view,并把你的内容调整的比status bar低一点点。如果你想用自定义的status background color,你可以设置statusBarViewBackgroundColor为任何你想要的颜色。

Subcalssing
如果你计划继承MMDrawerController,在你的继承类中导入MMDrawerController+Sbuclass.h文件,这样你就可以使用MMDrawerController0保护的方法。注意,少部分的方法会假设或者要求你调用super的方法,所以请注意调用super方法。
如果现有方法不足以实现你的需求,请打开Github的issue,告诉我们你的需求,我们会尽力相助。

MMDrawerBarButtonItem
我们用代码绘制了一个标准菜单按钮,你可以在任何UINavigationBar中使用,你也可以为它设置任何你想要的颜色。MMDrawerBarButtonItem包含在这个项目的subspec中,请尽情使用。
从iOS7开始,抽屉按钮被绘制的更细了。总的来说,设置颜色的方法不同了,颜色主要被tintColor决定。同时请注意,阴影也会随系统主题而不同。

Prebuilt Example Animations
为了你能更方便的使用MMDrawerController,我们提供了常用的动画效果。你只需要导入MMDrawerVisualStates子项目,便可以使用我们提供的视觉效果。
比如你需要使用滑动和缩放动画,你可以这样:

[drawerController setDrawerVisualStateBlock:[MMDrawerVisualState slideAndScaleVisualStateBlock]];

下面是我们的动画列表:

  • Slide:抽屉与中心视图滑动的速率相同。
  • Slide and Scale:抽屉在滑动的同时会进行缩放,并且alpha(透明度)值也会从0.0增长到1.0。
  • Swinging Door:抽屉会在中心视图和边缘之间晃动(字面意思看感觉像是果冻效果,原文:The drawer swings in along a hinge on the center view controller)。
  • Parallax:抽屉会以一个比中心视图频率低的频率晃动,并有一个视差效果(原文:The drawer slides in at a slower rate than the center view controller, giving a parallax effect)。

Stretchy(弹性) Drawer
默认情况下,当你把侧边抽屉拖到比它宽度还宽的位置时松手,会有一个果冻效果让侧边抽屉恢复到设置的宽度。你可以设置shouldStrethDrawer为NO来关闭这个效果,或者你也可以自定义在percentVisible大于1.0时的动画(原文:or you can make your own overshoot animation by creating a custom visual state block and setting up custom transforms for when percentVisible is greater than 1.0)。

Bounce Preview
为了使你的抽屉侧栏更容易被发现,你可以在应用首次加载时晃动一下抽屉侧栏。你可以用bouncePreviewForDrawerSide:completion: 方法来实现这个效果。
如果你需要自定义抽屉侧栏晃动的距离,你可以使用bouncePreviewForDrawerSide:distance:completion:方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MMDrawerController(0.6.0) 文档翻译(简介,非API文档) 的相关文章

  • 当前图像选择模式会擦除 UI

    我下面有一个非常简单的视图控制器 UI 实际上只是一个带有底部标签栏的按钮 import UIKit class ImageAdderViewController UIViewController override func viewDid
  • iOS模型层通知Controller对象

    https developer apple com library archive documentation General Conceptual DevPedia CocoaCore MVC html https developer a
  • 将UIWebView显示的PDF保存到本地

    我有一个UIViewController与UIWebView显示一个 pdf 文件 具体取决于之前单击的行UITableView 现在我想添加一个按钮 供用户在本地保存此 pdf 文件以供离线使用 然后还有第二个UITableView它应该
  • 有没有办法从 Instruments (Xcode) 的命令行实例中删除授权提示?

    我目前正在通过 bash 脚本使用 Instruments 来启动命令行界面以启动自动化插件的运行 在 4 2 中 这工作得很好 但是随着升级到 Xcode 4 3 我现在被提示需要授权用户 分析其他进程 即使授予了正确的凭据 也不会真正对
  • xcode 6 资产目录 iPhone 6

    这个问题还没有得到解答 使用资产目录时 特定于设备 非通用 选项为 1x 2x r 2x 3x 1x 是不必要的 因为它不是视网膜 2x 是 ip4 的最佳选择 分辨率为 640x960 r 2x 适合 ip5 分辨率为 640x1136
  • 从软件查找服务返回无效结果

    我尝试通过 XCode 组织者提交 iOS 应用程序 但在身份验证后失败 组织者说 从软件查找服务返回的结果无效 我怎么解决这个问题 检查 iTunes Connect 中您的应用程序状态是否为 等待上传 您可以更改状态以按 准备上传二进制
  • 如何在 UITextView 中禁用放大功能

    我想摆脱 UITextView 中的放大和文本选择 但我需要电话号码 链接和地址检测器 我在用 void addGestureRecognizer UIGestureRecognizer gestureRecognizer if gestu
  • SKScene和SKView的paused属性之间的区别

    我使用以下代码暂停 SKScene self paused YES 然而 根据这个answer https stackoverflow com a 21593852 2043580 by 安德烈 戈尔杰耶夫 https stackoverf
  • 设置UITextField的光标位置

    我查看了单点触控示例并尝试过 var range new NSRange selectionStart 1 NumberTextField SelectedTextRange IndexedRange GetRange range 但这会在
  • UIAlertAction 处理程序在延迟后运行

    我正在尝试将 UIAlertViews 更改为 UIAlertControllers 我为此设置了这个操作 UIAlertAction undoStopAction UIAlertAction actionWithTitle Undo St
  • 如何在 iOS 上更改设备音量 - 而不是音乐音量

    我想更改 iOS iPhone 上的设备音量 我知道我可以使用以下几行更改音乐库的音量 implement at first MediaPlayer framework MPMusicPlayerController musicPlayer
  • 如何计算CLLocationDistance的中心坐标

    我想计算我的位置和一些注释之间的中心点 到目前为止我已经这样做了 CLLocation myLoc self locMgr location MKPointAnnotation middleAnnotation locationV anno
  • UIView 周围的虚线边框

    如何在周围添加虚线边框UIView 像这样的东西 如果您喜欢子层 还有另一种方法 在您的自定义视图的 init 中 输入以下内容 border 是 ivar border CAShapeLayer layer border strokeCo
  • admob ios7错误音频框架

    我正在将 admob SDK 当前的 集成到我的上一个应用程序 IOS7 Xcode5 中 并且出现了一个新错误 在新项目上也是如此 我想我错过了一些东西 但我多次重新启动该过程 但错误仍然存 在 Undefined symbols for
  • 在 Swift 中,如何为具有自动布局的 UIView 制作动画,就像页面滑入一样?

    我尝试创建一个 UIView 来表示一个大小与设备屏幕相同的页面 由于该应用程序支持方向 因此我使用 AutoLayout 来构建它 它工作正常 直到我尝试将页面动画化以从右侧滑入 经过一番研究后 我能想到的最好的办法是 myView UI
  • Swift 错误:发出 SIGABRT 信号如何解决

    我只是 Swift 编码的初学者 我的想法很简单 就是一个有两个按钮的应用程序 单击时 文本字段将更改其文本 在 Main StoryBoard 中 我添加一个文本字段和两个按钮 在 ViewController swift 文件中 我这样
  • 如何在多个视图中显示相同的导航栏?

    我可以为一个视图重现以下导航栏 但是 一旦我单击按钮后移至下一个视图 我就会丢失最右边的两个图标 搜索 个人资料 据我所知 从故事板设置导航项目通常是按视图进行的 我可以为每个视图复制这些项目 但我想知道是否有更好的方法来完成一次 是否有教
  • 应用程序仅启用纵向,但 UIImagePickerController 在 iOS6 中旋转

    请注意 下面的答案 不适用于 iOS6 所以我仍然需要答案 我的应用程序仅启用纵向模式 但是 如果我将 UIImagePickerController 作为子视图嵌入其中 并旋转设备 则顶部和底部栏将保持在同一位置 但 UIImagePic
  • iOS 11 中的密码自动填充快速输入栏

    iOS 11 中引入了一项新功能 应用程序密码自动填充 此功能允许用户直接从键盘快速输入栏使用其应用程序中保存的密码 https techcrunch com 2017 06 08 ios 11s new password autofill
  • GCD 与自定义队列

    我想知道这两者的性能有什么区别 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY HIGH 0 perform complex operation dispat

随机推荐

  • Python绝技:运用Python成为顶级黑客

    Python 是一门常用的编程语言 它不仅上手容易 而且还拥有丰富的支持库 对经常需要针对自己所 处的特定场景 以极少的代码量实现所需的功能 Python绝技 运用Python成为顶级黑客结合具体的场景和真 实的案例 详述了 Python
  • 《软件测试的艺术》第三章 代码检查、走查和评审

    软件测试的艺术 第三章 代码检查 走查和评审 3 1 代码检查与走查 3 2 代码检查 3 2 1 代码检查小组 3 2 2 检查议程与注意事项 3 2 3 对事不对人 和人有关的注意事项 3 2 4 代码检查的衍生功效 3 3 用于代码检
  • 100个python算法超详细讲解:农夫过河

    100个python算法超详细讲解 谷哥技术 1 问题描述 一个农夫在河边带了一匹狼 一只羊和一棵白菜 他需要把这三样东西用 船带到河的对岸 然而 这艘船只能容下农夫本人和另外一样东西 如果农夫 不在场的话 狼会吃掉羊 羊也会吃掉白菜 请编
  • 鸿蒙内核阅读笔记-定时器

    鸿蒙内核阅读笔记 定时器 简介 核心模块 定时器 los swtmr c 介绍 阅读代码 函数部分 简介 近期在阅读鸿蒙liteOS a 由于是初次探索内核的奥秘 将一些阅读的心得进行分享 希望能在作为笔记的同时 也能帮助更多人学习 感谢图
  • springboot + eureka集群,实现注册中心,实现负载均衡

    搭建eureka集群 新建一个boot项目 File new project 如图选择 next 起名字如下 gt next finish 新建3个注册中心 以三个注册中心为例 想多的自己加 项目名字上 new module next 起名
  • Basic Level 1055 集体照 (25分)

    题目 拍集体照时队形很重要 这里对给定的 N 个人 K 排的队形设计排队规则如下 每排人数为 N K 向下取整 多出来的人全部站在最后一排 后排所有人的个子都不比前排任何人矮 每排中最高者站中间 中间位置为 m 2 1 其中 m 为该排人数
  • PowerDesigner安装步骤和打印错误

    1 解压 2 双击运行安装包 等待初始化 3 初始化完成后点击next 4 选择地区 同意协议 完成后点击next 5 选择安装位置 完成后点击next 6 选择要安装的组件 eclipse我不需要 需要可以勾选并配置 完成后点击next
  • pandas apply使用多列计算生成新的列

    在python数据分析中 有时需要根据多列数据生成中间结果 pandas给我们带来了很多方便 通常简短的代码可以实现一些高级功能 灵活掌握一些技巧可以事倍功半 pandas的apply方法用于对指定列的每个元素进行相同的操作 下面生成一个d
  • 静态代码分析工具清单:开源篇(各语言)

    本文是一个静态代码分析工具的清单 共有26个工具 包括4个 NET工具 2个Ada工具 7个C 工具 4个Java工具 2个JavaScript工具 1个Opa工具 2个Packaging工具 3个Perl工具 1个Python工具 1 N
  • Python——列表排序和赋值

    1 列表排序 列表排序方法 ls sort 对列表ls 中的数据在原地进行排序 ls 13 5 73 4 9 ls sort ls sort reverse False 默认升序 reverse True 降序 ls 13 5 73 4 9
  • Mysql备份工具xtraback全量和增量测试

    Mysql备份工具xtraback全量和增量测试 xtrabackup 是 percona 的一个开源项目 可以热备份innodb XtraDB 和MyISAM 会锁表 官方网址http www percona com docs wiki
  • 系统运维日常工作有哪些,应该具备哪些技能

    一 日常工作内容 看监控 网站流量 CDN流量 看邮件有没有普通业务监控报警 看有家中有没有其他需要做的工作 处理报警 查看报警的原因 和开发一起解决 并且尽量找出避免再次发生的方法 例如添加一些定时清理脚本 处理发布 基本都是自动化 但是
  • 使用tab键分割的文章能快速转换成表格。( )_Word教程:最常用的 7 个 Tab 键用法,瞅一眼就会了...

    Tab键一直是键盘上 不起眼 的一个按键 平时很多人可能不会去碰触这个键 实际上 它有很多实用的功能 如果用好了 可以大大提高我们的操作效率 01 段首空两格 写文章时 通常段首需要空两格 许多人会直接敲空格 这种操作是很Low的 其实 你
  • git cherry-pick apply-merge 任意commit(s)

    文章目录 必杀技 困惑 cherry pick 必杀技 是什么让Git 从众多版本控制系统中脱颖而出 独领风骚 当然是其分支模型 正因如此 人称分支模型为Git的 必杀技 如果不能熟练的运用Git的分支技巧 那就远离了Git的精华 困惑 我
  • zabbix配置微信报警

    如有错误 敬请谅解 此文章仅为本人学习笔记 仅供参考 如有冒犯 请联系作者删除 6 1 注册企业微信 企业微信注册地址 https work weixin qq com 设置总部门名称添加成员 也可以成员扫码加入 点击 成员加入 过程略 6
  • C语言实现RGB888转BMP格式图片功能

    1 bmp格式介绍 bmp格式图片里实际存储的也是RGB原始数据 可以分为8bit 16bit 24bit 32bit的bmp格式 也就是指bmp图片中保存的RGB是用8bit 16bit 24bit 32bit来表示 简单理解就是在原始R
  • 2020年IT技术的发展趋势!

    在IT范畴 企业指导者在IT范畴做出的选择不只会对业务开展和客户关系产生影响 也会对整体经济产生影响 而整体经济越来越依赖于为关键业务提供牢靠效劳的企业网络 随着岁末年初的到来 如今是瞻望将来一年行业开展趋向的时分 以便企业为做出明智的决议
  • 1054 求平均值

    1054 求平均值 20 分 本题的基本要求非常简单 给定 N 个实数 计算它们的平均值 但复杂的是有些输入数据可能是非法的 一个 合法 的输入是 1000 1000 区间内的实数 并且最多精确到小数点后 2 位 当你计算平均值的时候 不能
  • 手写Mybatis

    Mybatis核心配置文件就是为了配置Configration 因此要首先会解析Mybatis核心配置文件 首先使用dom4J解析Mybatis核心配置文件 新建模块演示dom4j解析 xml 目录放错了 无所谓 引入依赖 从原来项目可以拷
  • MMDrawerController(0.6.0) 文档翻译(简介,非API文档)

    Mutual Mobile Drawer Controller 随着使用抽屉效果的应用越来越多 MMDrawerController应运而生 MMDrawerController是一个仅支持侧边抽屉导航的轻量级库 同时库中还提供了定制展现