iOS开发——实战技术OC篇&关于蒙板和弹出菜单

关于蒙板和弹出菜单

一:关于蒙板

蒙板的作用一般就是用来实现不能做其他操作还有一些模糊效果提示用户

我们只需要自定义一个View,并且创建两个类方法用来给外界调用实现显示和隐藏

+ (void)show;

 + (void)hide;

显示:直接添加到window上,并且设置和window同样大小,然后设置相应的透明度(alpla)

 1 + (void)show
 2
 3 {
 4
 5
 6
 7
 8
 9     iCocosCover *cover = [[self alloc] init];
10
11
12
13     cover.frame = [UIApplication sharedApplication].keyWindow.bounds;
14
15
16
17     cover.backgroundColor = [UIColor blackColor];
18
19
20
21     cover.alpha = 0.5;
22
23
24
25     // 获取主窗口
26
27     [[UIApplication sharedApplication].keyWindow addSubview:cover];
28
29 }

隐藏:遍历window的所有子控件,如果遍历到的子控件对应的类是当前类酒移除

 1 + (void)hide
 2
 3 {
 4
 5     // 隐藏蒙板
 6
 7     for (UIView *childView in [UIApplication sharedApplication].keyWindow.subviews) {
 8
 9         if ([childView isKindOfClass:self]) { // 是蒙板
10
11             [childView removeFromSuperview];
12
13         }
14
15     }
16
17 }

二:关于弹出菜单,

关于弹出菜单的方式有很多中,平时我们比较常见的就是类ipad上面的Pop菜单,显示和隐藏在对应位置,这里也以类似的功能区实现。

我们这里使用的是XIB来加载对应的控件。

创建一个UIView的类并且创建一个和他一样同名的XIB,然后将它们关联

在头文件中创建显示在对应的点和隐藏在对应点的方法,这里使用的是自定义Block实现同UIView动画类似的功能,关于Block的使用请查看笔者之前写的:http://www.cnblogs.com/iCocos/p/4731404.html及里面涉及到的其他高级用法饿实战

 1 // 显示到某个点
 2
 3 + (instancetype)showInPoint:(CGPoint)point;
 4
 5
 6
 7 // 隐藏到某个点
 8
 9 //- (void)hideInPoint:(CGPoint)point completion:(参数类型)参数变量名;
10
11 // completion:隐藏完成的时候执行的代码
12
13 - (void)hideInPoint:(CGPoint)point completion:(void(^)())completion;

显示弹出菜单:直接加载XIB,并且使用外界传进来的点来显示在对应的点上面

 1 + (instancetype)showInPoint:(CGPoint)point
 2
 3 {
 4
 5    iCocosPopMenu *menu =  [[NSBundle mainBundle] loadNibNamed:@"iCocosPopMenu" owner:nil options:nil][0];
 6
 7
 8
 9     menu.center = point;
10
11
12
13     [[UIApplication sharedApplication].keyWindow addSubview:menu];
14
15
16
17     return menu;
18
19 }

隐藏弹出菜单:这里在内部使用UIView动画,正好给我们自定义Block参照。实现弹出菜单的隐藏,使用外界传进来的点实现隐藏在对应的点处,这里的隐藏使用的是UIView的transform动画效果,在完成动画效果之后将自己从父控件中移除。

由于我们需要实现同UIView动画的,所以需要判断是否有执行这个Block,如果有酒根据保存在Block里面的代码去执行相应的操作

 1 // 隐藏
 2
 3 - (void)hideInPoint:(CGPoint)point completion:(void (^)())completion
 4
 5 {
 6
 7     /*
 8
 9      void (^completion)() = ^{
10
11
12
13      // 当移动完成的时候,把蒙板消失
14
15      [XMGCover hide];
16
17      };
18
19      */
20
21     [UIView animateWithDuration:.5 animations:^{
22
23
24
25         self.center = point;
26
27
28
29         // 直接修改父控件的尺寸,是不会影响子控件
30
31 //        self.bounds = CGRectMake(0, 0, 1, 1);
32
33
34
35         // 如果设置0,控件直接缩放为0,没有动画,如果想要动画,搞一个最小值
36
37         self.transform = CGAffineTransformMakeScale(0.01, 0.01);
38
39
40
41     } completion:^(BOOL finished) {
42
43
44
45         [self removeFromSuperview];
46
47
48
49         if (completion) {
50
51
52
53             completion();
54
55         }
56
57     }];
58
59 }
60
61  

但我们每次隐藏的时候就会点击弹出菜单中对应的关闭按钮实现隐藏,但是这里我们需要去高手控制器我们要隐藏这个弹出菜单,这里我们使用通知的方式去告诉他。

在弹出菜单的头文件中创建一个协议,并且声明协议方法和协议属性

 1 @class iCocosPopMenu;
 2
 3 @protocol iCocosPopMenuDelegate <NSObject>
 4
 5
 6
 7 @optional
 8
 9 - (void)popMenuDidClickCloseMenu:(iCocosPopMenu *)menu;
10
11
12
13 @end

代理属性:

1 2 3 @property (nonatomic, weak) id<iCocosPopMenuDelegate> delegate; 4 5

在监听点击关闭按钮的方法中实现判断控制器是否有遵守协议并且实现代理方法,如果有就去执行代理方面里面的代码

 1 // 点击关闭按钮,调用
 2
 3 - (IBAction)close:(id)sender {
 4
 5
 6
 7     // 通知代理做事情,告诉代理点击了关闭
 8
 9     if ([_delegate respondsToSelector:@selector(popMenuDidClickCloseMenu:)]) {
10
11         [_delegate popMenuDidClickCloseMenu:self];
12
13     }
14
15
16
17 }

到上面基本上就已经完成了蒙板的弹出菜单的简单封装,如果你想实现的更加炫酷或者拓展其他功能那么这可以直接修改里面相应的代码就可以实现

最后我们在控制器中实现少量的代码就可现比较酷的效果

在界面中随意添加一个按钮,我这里以左上角为例添加一个navigationItem,并且添加点击事件:

1  UIImage *image = [UIImage imageWithOriginRenderingName:@"CS50_activity_image"];
2
3
4
5     // 设置导航条左边按钮
6
7     self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStyleDone target:self action:@selector(activity)];

在点击事件的方法中实现相应的功能

由于我们需要点击这个按钮实现显示弹出菜单和蒙板,所以我们只需要在里面使用前面提供的方法就可以实现我们想要的功能

 1 // 点击活动按钮的时候调用
 2
 3 - (void)activity
 4
 5 {
 6
 7     // 弹出蒙板,
 8
 9     // 只要以后想要把一个控件显示在最外边,就添加到窗口,提供一个show方法
10
11     [XMGCover show];
12
13
14
15     // 弹出pop菜单
16
17     iCocosPopMenu *menu = [iCocosPopMenu showInPoint:self.view.center];
18
19
20
21 }

设置控制器为我们弹出菜单的代理,实现点你关闭按钮去关闭移除弹出菜单,并且隐藏蒙板:遵守XMGPopMenuDelegate协议

  • menu.delegate = self;

在大理方法中使用前面提供的隐藏弹出菜单在对应点的方法实现弹出菜单的隐藏,然后在他的block中实现隐藏蒙板,这里就做到了先隐藏弹出菜单在隐藏蒙板。

 1 // block:作用保存一段代码
 2
 3 #pragma mark - iCocosPopMenuDelegate
 4
 5 // 点击菜单上关闭按钮的时候就会调用
 6
 7 - (void)popMenuDidClickCloseMenu:(iCocosPopMenu *)menu
 8
 9 {
10
11     // 定义移动完成的block,保存移动完成的代码
12
13     void (^completion)() = ^{
14
15
16
17         // 当移动完成的时候,把蒙板消失
18
19         [XMGCover hide];
20
21     };
22
23     // block精髓:可以当做参数去用。
24
25     // 菜单移动到某个位置,并且缩放。
26
27     [menu hideInPoint:CGPointMake(44, 44) completion:completion];
28
29  }

最后就可以看到一个比较炫酷的动画显示和隐藏界面

    

时间: 2024-08-24 15:49:33

iOS开发——实战技术OC篇&关于蒙板和弹出菜单的相关文章

iOS开发——实战技术OC篇&amp;应用帮助界面简单实现

应用帮助界面简单实现 有的时候我们可能遇到一些关于应用中的技术或者信息不够明确,所以在使用应用的时候可能会遇到一些不知道所措的情况,比如关于一些难一点的游戏应用的操作,关于应用中一些比较隐藏的功能疑惑是操作完成后需要用户去根据需求做其他相应操作的的功能,所以这里我们就实现一个简单的帮组界面,也许跟实际开发中有一些区别,但是思路理解基本上就没有什么问题了. 我们知道平时帮助界面来说,可能是使用一个掩饰案例,可能是网络连接,也能是说明文档,这里我们就简单一点使用网页结合JSON数据来实现,网页实现也

iOS开发——实战技术OC篇&amp;产品推荐界面的实现

产品推荐界面的实现 目前很多公司都仅仅只有一个项目,所以他们关于其他的项目肯定会做相应的推广,而在APp内部使用产品推荐实现APP的推广使一种很常见的现象,因为不需要什么成本,所以今天就简单介绍一下这么去搭建一个简单的产品推荐界面. 本章重点: 1:使用JSON数据:将JSON数据序列化,然后显示到界面上 2:根据设备是否安装对应的应用显示不同的信息,比如图片 3:根据设备是否安装对应的应用点击对应的按钮实现不同的功能 好了下面就来看看关于产品推荐界面是怎么去实现的! 1:JSON数据 2:对应

iOS开发——实战技术OC篇&amp;点击状态栏ScrollView(包括子控件)自动滚到顶部

点击状态栏ScrollView(包括子控件)自动滚到顶部 其实这种方式我们平时见的还是比较多的,而且适合用户的需求,所以就搬来琢磨了一下,感觉效果还不错 这里就直接将解决思路一一写出来不将代码分段展示了,在代码中我加了详细的注释objective-c的套路和swift基本一样,在最后会将Swift和objective-c的代码一起放上,如果需要直接解决问题的童鞋可以直接将代码拷贝到工程里即可 首先创建一个topWindow继承至NSObject,这里我们考虑将这个功能完全封装起来,所以所有的方法

iOS开发——高级技术OC篇&amp;运行时(Runtime)机制

运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档. 下面就来看看什么是运行时,我们要怎么在iOS开发中去使用它. 官方介绍: 这里我们主要关注的是最后一种! 下面来看看Runtime的相关总结 #pragma mark 获取属性成员 /********************************************************

iOS开发——实战总结OC篇&amp;网易彩票开发知识点总结

网易彩票开发知识点总结 关于网易彩票开发中遇到了不少的坑,弄了好久才弄懂,或者有些犹豫很久没用就不记得了,所以这里就总结了一下,希望以后不会忘记,就算忘记也能快速查看! /***************************************&.设置状态栏样式(白色) 两种方法******************************************/ 1 -(UIStatusBarStyle)preferredStatusBarStyle 2 3 { 4 5 if ([sel

iOS开发——使用技术OC篇&amp;保存(获取)图片到(自定义)相册

保存(获取)图片到(自定义)相册 最近在学 iOS相关技术(绘图篇实现画板功能)的时候设计到了两个常用的知识点,那就是保存图片到相册和葱相册中获取图片. 只是个人比较好奇拓展一些技术,说的难听点叫做装牛角尖,好听点就是为了装逼而已,所以在保存相册的时候使用真及测试发现不能保存到我iPhone里 main的自定义相册里面,就查看文档和资料,也借鉴别人的分享实现了想要的功能,就把他给记录下来,这个虽然没有直接保存和获取常用但是也是一项很好的实用技术. 一:首先来看看怎么获取相册的图片: 1 // 弹

iOS开发——使用技术OC篇&amp;项目实战总结之开发技巧

项目实战总结之开发技巧 本文收集了25个关于可以提升程序性能的提示和技巧 1.使用ARC进行内存管理 2.在适当的情况下使用reuseIdentifier 3.尽可能将View设置为不透明(Opaque) 4.避免臃肿的XIBs 5.不要阻塞主线程 6.让图片的大小跟UIImageView一样 7.选择正确的集合 8.使用GZIP压缩 9.重用和延迟加载View 10.缓存.缓存.缓存 11.考虑绘制 12.处理内存警告 13.重用花销很大的对象 14.使用Sprite Sheets 15.避免

iOS开发——使用技术OC篇&amp;简单九宫格锁屏功能的实现与封装

简单九宫格锁屏功能的实现与封装 首先来看看最后的实现界面. 在这开始看下面的内容之前希望你能先大概思考活着回顾一下如果 你会怎么做,只要知道大概的思路就可以. 由于iphone5指纹解锁的实现是的这个功能呗淘汰,但是你可能会在想,都淘汰了你还在这里说个毛线啊,其实大家都知道,编程注重的思想,当然会了这个你不可能就会了指纹技术,哪还得等笔者在后面的学习中给大家分享,只是或许有一天这种功能或者思路在哪里要用到你不觉得是一件很开心的事情吗,而且如果你是不想自己敲的话直接可以拿来用. 好了不多废话直接上

iOS开发——使用技术OC篇&amp;剪切版的实现

剪切版的实现 在iOS中,可以使用剪贴板实现应用程序之中以及应用程序之间实现数据的共享.比如你可以从iPhone QQ复制一个url,然后粘贴到safari浏览器中查看这个链接的内容. 一.在iOS中下面三个控件,自身就有复制-粘贴的功能: 1.UITextView 2.UITextField 3.UIWebView 二.UIKit framework提供了几个类和协议方便我们在自己的应用程序中实现剪贴板的功能. 1.UIPasteboard:我们可以向其中写入数据,也可以读取数据 2.UIMe