一、自定义蒙版--封装控件,先想好外界怎么来调用,根据外界调用的方法,然后进入内部实现

  • 在外部,调用蒙版的方法--[ChaosCover show];  [ChaosCover hide];
  • 内部实现
  1. #import "ChaosCover.h"
  2.  
  3. @implementation ChaosCover
  4. + (void)show
  5. {
  6. // 创建HUD
  7. ChaosCover *cover = [[ChaosCover alloc] initWithFrame:ChaosScreenBounds];
  8. cover.backgroundColor = [UIColor blackColor];
  9. cover.alpha = 0.5;
  10. // 添加到主窗口上
  11. [ChaosKeyWindow addSubview:cover];
  12. }
  13.  
  14. + (void)hide
  15. {
  16. // 遍历主窗口的子控件,找出HUD
  17. for (UIView *childView in ChaosKeyWindow.subviews) {
  18. if ([childView isKindOfClass:self]) {
  19. [childView removeFromSuperview];
  20. }
  21. }
  22. }
  23. @end

二、封装活动菜单--在蒙版上显示,点击叉叉,动画形式消失在左上角

  • 使用xib描述了活动菜单的内容

  • 外部的调用也是显示  和隐藏(动画形式)两个方法,此外 外部还要监听叉叉的点击。动画完成后模仿了系统动画完成传递block的方法来解决
  1. @implementation ChaosActiveMenu
  2. - (IBAction)closeBtn:(id)sender {
  3. if ([_delegate respondsToSelector:@selector(activeMenuDidClickClose:)]) {
  4. [_delegate activeMenuDidClickClose:self];
  5. }
  6. }
  7.  
  8. // 封装类方法,让隐藏的点由外部决定
  9. + (void)hideInpoint:(CGPoint)point completion:(void(^)())completion
  10. {
  11. for (ChaosActiveMenu *childView in ChaosKeyWindow.subviews) {
  12. if ([childView isKindOfClass:self]) {
  13. [childView setUpHideAnimationWithPoint:point completion:completion];
  14. }
  15. }
  16.  
  17. }
  18.  
  19. // 根据点坐标,设置隐藏的动画
  20. - (void)setUpHideAnimationWithPoint:(CGPoint)point completion:(void(^)())completion
  21. {
  22. [UIView animateWithDuration:0.5 animations:^{
  23.  
  24. CGAffineTransform translate = CGAffineTransformMakeTranslation( -self.center.x + , -self.center.y + );
  25. CGAffineTransform translateScale = CGAffineTransformScale(translate, 0.01, 0.01);
  26. self.transform = translateScale;
  27.  
  28. } completion:^(BOOL finished) {
  29. // HUD 移除
  30. [self removeFromSuperview];
  31. if (completion) {
  32. completion();
  33. }
  34. }];
  35.  
  36. }
  37.  
  38. // 根据点坐标显示activeMenu
  39. + (instancetype)showInPoint:(CGPoint)point
  40. {
  41. // 显示活动的图片
  42. ChaosActiveMenu *menu = [ChaosActiveMenu activeMenu];
  43. menu.center = point;
  44. [ChaosKeyWindow addSubview:menu];
  45. return menu;
  46. }
  47.  
  48. + (instancetype)activeMenu
  49. {
  50. return [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([ChaosActiveMenu class]) owner:nil options:nil][];
  51. }
  52. @end
  • 在运用block的时候遇到了点问题,自己对block运用的是不很熟练

三、自定义下拉菜单--带弹簧效果。

--行数计算公式  row = (count - 1) / cols + 1;九宫格布局应该经常用

--分割线的巧妙添加

--自己做动画方面不足,通过这个例子学到了,先利用transform将空间平移,之后通过取消平移downMenu.transform = CGAffineTransformIdentity;来做动画

  1. @interface ChaosDownMenu ()
  2. /** items */
  3. @property(nonatomic,strong) NSArray *items;
  4. /** 子控件按钮集合 */
  5. @property(nonatomic,strong) NSMutableArray *btnArray;
  6. @end
  7.  
  8. @implementation ChaosDownMenu
  9.  
  10. - (NSMutableArray *)btnArray
  11. {
  12. if (_btnArray == nil) {
  13. _btnArray = [NSMutableArray array];
  14. }
  15. return _btnArray;
  16. }
  17.  
  18. #pragma mark - 隐藏downMenu的方法
  19. - (void)hide
  20. {
  21. [UIView animateWithDuration:0.3 animations:^{
  22.  
  23. self.transform = CGAffineTransformMakeTranslation(, -self.height);
  24.  
  25. } completion:^(BOOL finished) {
  26.  
  27. [self removeFromSuperview];
  28. }];
  29. }
  30.  
  31. #pragma mark - 根据坐标点 子控件按钮的模型集合 初始化
  32. + (instancetype)showInView:(UIView *)superView point:(CGPoint)point items:(NSArray *)items
  33. {
  34. NSInteger count = items.count;
  35.  
  36. if (count % ) { // 模型个数不是3的倍数
  37. NSException *exc = [NSException exceptionWithName:@"items个数不符合" reason:@"items的个数必须是3的倍数" userInfo:nil];
  38. [exc raise];
  39. }
  40.  
  41. // 行数计算公式 row = (count - 1) / cols + 1
  42. NSInteger row = (count - ) / ChaosCols + ;
  43.  
  44. ChaosDownMenu *downMenu = [[ChaosDownMenu alloc] init];
  45.  
  46. downMenu.items = items;
  47.  
  48. // width:ChaosScreenBounds.size.width height:row * itemWH
  49. downMenu.frame = CGRectMake(point.x, point.y, ChaosScreenBounds.size.width, row * ChaosItemWH);
  50.  
  51. downMenu.backgroundColor = [UIColor blackColor];
  52.  
  53. // 添加所有子控件
  54. [downMenu setUpAllBtns:items];
  55.  
  56. // 添加分割线
  57. [downMenu setUpDivideView];
  58.  
  59. // 添加黑色的view,防止动画的时候漏出后面父控件的白色
  60. UIView *blackView = [[UIView alloc] initWithFrame:downMenu.frame];
  61.  
  62. blackView.backgroundColor = [UIColor blackColor];
  63.  
  64. [superView addSubview:blackView];
  65.  
  66. [superView addSubview:downMenu];
  67.  
  68. // 动画--首先让menu平移上去
  69. downMenu.transform = CGAffineTransformMakeTranslation(, -(row * ChaosItemWH));
  70.  
  71. [UIView animateWithDuration:0.5 delay: usingSpringWithDamping:0.3 initialSpringVelocity: options:UIViewAnimationOptionCurveEaseInOut animations:^{
  72.  
  73. downMenu.transform = CGAffineTransformIdentity;
  74.  
  75. } completion:^(BOOL finished) {
  76.  
  77. [blackView removeFromSuperview];
  78.  
  79. }];
  80. return downMenu;
  81. }
  82.  
  83. - (void)setUpDivideView
  84. {
  85. // 添加纵向分割线
  86. // 纵向分割线的数目
  87. NSInteger colsViewCount = ChaosCols - ;
  88. // 纵向分割线的xywh
  89. for (int i = ; i <colsViewCount; i++) {
  90. UIView *view = [[UIView alloc] init];
  91. view.frame = CGRectMake((i + ) * ChaosItemWH, , , self.height);
  92. view.backgroundColor = [UIColor whiteColor];
  93. [self addSubview:view];
  94. }
  95. // 添加横向分割线
  96. // 横向分割线条数
  97. NSInteger rowViewCount = (self.items.count - ) / ChaosCols;
  98. for (int i = ; i < rowViewCount; i++) {
  99.  
  100. UIView *view = [[UIView alloc] init];
  101. view.frame = CGRectMake(, (i + ) * ChaosItemWH, self.width, );
  102. view.backgroundColor = [UIColor whiteColor];
  103. [self addSubview:view];
  104. }
  105. }
  106.  
  107. #pragma mark - 添加子控件
  108. - (void)setUpAllBtns:(NSArray *)items
  109. {
  110. for (ChaosMenuItem *item in items) {
  111. UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
  112. [btn setTitle:item.title forState:UIControlStateNormal];
  113. [btn setImage:item.image forState:UIControlStateNormal];
  114. btn.backgroundColor = [UIColor blackColor];
  115. [self.btnArray addObject:btn];
  116. [self addSubview:btn];
  117. }
  118. }
  119.  
  120. #pragma mark - 布局子控件
  121. - (void)layoutSubviews
  122. {
  123. [super layoutSubviews];
  124.  
  125. CGFloat x = ;
  126. CGFloat y = ;
  127. for (int i = ; i < self.btnArray.count; i ++) {
  128. UIButton *btn = self.btnArray[i];
  129. int rowNO = i / ChaosCols;
  130. int colsNO = i % ChaosCols;
  131. x = colsNO * ChaosItemWH;
  132. y = rowNO * ChaosItemWH;
  133. btn.frame = CGRectMake(x, y, ChaosItemWH, ChaosItemWH);
  134. }
  135. }
  136.  
  137. @end

iOS彩票项目--第二天,自定义蒙版、封装活动菜单、自定义pop菜单的更多相关文章

  1. iOS彩票项目--第五天,新特性引导页的封装、返回按钮的自定义、导航控制器的滑动返回以及自定义滑动返回功能

    一.上次实现了在AppDelegate中通过判断app版本决定是否进入新特性页面,今天将AppDelegate中的一坨进行了封装.将self.window的根控制器到底应该为新特性界面,还是主页面,封 ...

  2. iOS彩票项目--第一天,自定义TabBar控制器和自定义TabBar,自定义导航控制器

    一.环境配置,和项目层次搭建 二.自定义TabBar 项目中TabBar中的导航按钮美工给的图片太大,图片中包含了图片和文字.最主要的是TabBar上面的按钮图片尺寸是有规定的,当高度大于44的时候, ...

  3. iOS彩票项目--第三天,搭建竞技场和发现,搭建幸运选号和我的彩票界面

    一.竞技场搭建--UISegmentedControl的使用 // 重写 自定义控制器的view - (void)loadView { UIImageView *imgView = [[UIImage ...

  4. iOS彩票项目--第六天,运用MVC思想搭建设置界面(非storyboard方法)

    一.我只想说封装的思想很重要,MVC的思想也很重要,利用MVC思想搭建一下的界面 先说显示出来的cell,有三种(图中的两种,还有一种是最普通的,没有图片的),这种显示不同的cell,交给模型来处理, ...

  5. iOS彩票项目--第四天,新特性界面搭建,UICollectionViewController的初次使用

    一.新特性界面搭建的思路: 在AppDelegate加载主窗体的时候进行判断程序版本号,直接进入程序或者进入新特性展示界面 取出当前的版本号,与旧的版本号相比较(旧的版本号在进入程序的时候存起来 =& ...

  6. iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

    一.初次读取json数据 二.KVC转模型技巧,这里的技巧主要解决的是字典中的key 与 模型中有的属性对应不起来的时候 的解决办法 <方法1> <方法2>运行时字典转模型,运 ...

  7. iOS商城demo、音乐播放器、视频通话、自定义搜索、转场动画等源码

    iOS精选源码 微信自定义搜索框实现 一个商城Demo,持续更新中 在Object-C中学习数据结构与算法之排序算法 iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果 XLsn0wPushTimePi ...

  8. iOS开源项目周报1222

    由OpenDigg 出品的iOS开源项目周报第二期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. io ...

  9. 直接拿来用!最火的iOS开源项目

    1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是G ...

随机推荐

  1. 调试解决iOS内存泄漏

    这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及NSZombieEnabled设置的使用. 本文假设你已经比较熟悉Obj-C的内存管理机制. 实验的开发环境:X ...

  2. oracle11g本地可以访问但局域网无法访问

    问题描述,现在有两台电脑 A 和 B : 1)电脑 A 上有 Oracle11G服务端: ip地址 192.168.1.198; 端口1521: 2)电脑 A 本机连接数据库正常,可以登录及操作等: ...

  3. DataTime? 的 GetValueOrDefault() 方法

    DataTime? 转换为 DataTime类型 就可以调用 ToString()  自定义格式 @item.CreateDate.GetValueOrDefault().ToString(" ...

  4. PLSQL_统计信息系列02_统计信息的对象

    20150505 Created By BaoXinjian

  5. android检测网络连接状态示例讲解

    网络的时候,并不是每次都能连接到网络,因此在程序启动中需要对网络的状态进行判断,如果没有网络则提醒用户进行设置   Android连接首先,要判断网络状态,需要有相应的权限,下面为权限代码(Andro ...

  6. Linux时钟

    一.前言 时钟或者钟表(clock)是一种计时工具,每个人都至少有一块,可能在你的手机里,也可能佩戴在你的手腕上.如果Linux也是一个普通人的话,那么她的手腕上应该有十几块手表,包括:CLOCK_R ...

  7. VS2010中遇到_WIN32_WINNT not defined

    VS2010中编程时遇到这个问题 _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h) 解决办法: ...

  8. Python asin() 函数

    描述 asin() 返回x的反正弦弧度值. 语法 以下是 asin() 方法的语法: import math math.asin(x) 注意:asin()是不能直接访问的,需要导入 math 模块,然 ...

  9. mysql-5.7 innodb change buffer 详解

    一.innodb change buffer 介绍: 1.innodb change buffer 是针对oltp场景下磁盘IO的一种优化(我也感觉这个不太像人话,但是它又非常的准确的说明 innod ...

  10. Java:HttpClient篇,Cookie概述,及其在HttpClient4.2中的应用

    1. Cookie 概述 Cookie是什么? Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递.Cookie 包含每次用户访问站点时 Web 应用程序都可以读取 ...