标签:
关于蒙板和弹出菜单
一:关于蒙板
蒙板的作用一般就是用来实现不能做其他操作还有一些模糊效果提示用户
我们只需要自定义一个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协议
在大理方法中使用前面提供的隐藏弹出菜单在对应点的方法实现弹出菜单的隐藏,然后在他的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 }
最后就可以看到一个比较炫酷的动画显示和隐藏界面
标签:
原文地址:http://www.cnblogs.com/iCocos/p/4733392.html