iOS彩票项目--第二天,自定义蒙版、封装活动菜单、自定义pop菜单
一、自定义蒙版--封装控件,先想好外界怎么来调用,根据外界调用的方法,然后进入内部实现
- 在外部,调用蒙版的方法--[ChaosCover show]; [ChaosCover hide];
- 内部实现
#import "ChaosCover.h" @implementation ChaosCover
+ (void)show
{
// 创建HUD
ChaosCover *cover = [[ChaosCover alloc] initWithFrame:ChaosScreenBounds];
cover.backgroundColor = [UIColor blackColor];
cover.alpha = 0.5;
// 添加到主窗口上
[ChaosKeyWindow addSubview:cover];
} + (void)hide
{
// 遍历主窗口的子控件,找出HUD
for (UIView *childView in ChaosKeyWindow.subviews) {
if ([childView isKindOfClass:self]) {
[childView removeFromSuperview];
}
}
}
@end
二、封装活动菜单--在蒙版上显示,点击叉叉,动画形式消失在左上角
- 使用xib描述了活动菜单的内容

- 外部的调用也是显示 和隐藏(动画形式)两个方法,此外 外部还要监听叉叉的点击。动画完成后模仿了系统动画完成传递block的方法来解决
@implementation ChaosActiveMenu
- (IBAction)closeBtn:(id)sender {
if ([_delegate respondsToSelector:@selector(activeMenuDidClickClose:)]) {
[_delegate activeMenuDidClickClose:self];
}
} // 封装类方法,让隐藏的点由外部决定
+ (void)hideInpoint:(CGPoint)point completion:(void(^)())completion
{
for (ChaosActiveMenu *childView in ChaosKeyWindow.subviews) {
if ([childView isKindOfClass:self]) {
[childView setUpHideAnimationWithPoint:point completion:completion];
}
} } // 根据点坐标,设置隐藏的动画
- (void)setUpHideAnimationWithPoint:(CGPoint)point completion:(void(^)())completion
{
[UIView animateWithDuration:0.5 animations:^{ CGAffineTransform translate = CGAffineTransformMakeTranslation( -self.center.x + , -self.center.y + );
CGAffineTransform translateScale = CGAffineTransformScale(translate, 0.01, 0.01);
self.transform = translateScale; } completion:^(BOOL finished) {
// HUD 移除
[self removeFromSuperview];
if (completion) {
completion();
}
}]; } // 根据点坐标显示activeMenu
+ (instancetype)showInPoint:(CGPoint)point
{
// 显示活动的图片
ChaosActiveMenu *menu = [ChaosActiveMenu activeMenu];
menu.center = point;
[ChaosKeyWindow addSubview:menu];
return menu;
} + (instancetype)activeMenu
{
return [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([ChaosActiveMenu class]) owner:nil options:nil][];
}
@end
- 在运用block的时候遇到了点问题,自己对block运用的是不很熟练

三、自定义下拉菜单--带弹簧效果。
--行数计算公式 row = (count - 1) / cols + 1;九宫格布局应该经常用
--分割线的巧妙添加
--自己做动画方面不足,通过这个例子学到了,先利用transform将空间平移,之后通过取消平移downMenu.transform = CGAffineTransformIdentity;来做动画
@interface ChaosDownMenu ()
/** items */
@property(nonatomic,strong) NSArray *items;
/** 子控件按钮集合 */
@property(nonatomic,strong) NSMutableArray *btnArray;
@end @implementation ChaosDownMenu - (NSMutableArray *)btnArray
{
if (_btnArray == nil) {
_btnArray = [NSMutableArray array];
}
return _btnArray;
} #pragma mark - 隐藏downMenu的方法
- (void)hide
{
[UIView animateWithDuration:0.3 animations:^{ self.transform = CGAffineTransformMakeTranslation(, -self.height); } completion:^(BOOL finished) { [self removeFromSuperview];
}];
} #pragma mark - 根据坐标点 和 子控件按钮的模型集合 初始化
+ (instancetype)showInView:(UIView *)superView point:(CGPoint)point items:(NSArray *)items
{
NSInteger count = items.count; if (count % ) { // 模型个数不是3的倍数
NSException *exc = [NSException exceptionWithName:@"items个数不符合" reason:@"items的个数必须是3的倍数" userInfo:nil];
[exc raise];
} // 行数计算公式 row = (count - 1) / cols + 1
NSInteger row = (count - ) / ChaosCols + ; ChaosDownMenu *downMenu = [[ChaosDownMenu alloc] init]; downMenu.items = items; // width:ChaosScreenBounds.size.width height:row * itemWH
downMenu.frame = CGRectMake(point.x, point.y, ChaosScreenBounds.size.width, row * ChaosItemWH); downMenu.backgroundColor = [UIColor blackColor]; // 添加所有子控件
[downMenu setUpAllBtns:items]; // 添加分割线
[downMenu setUpDivideView]; // 添加黑色的view,防止动画的时候漏出后面父控件的白色
UIView *blackView = [[UIView alloc] initWithFrame:downMenu.frame]; blackView.backgroundColor = [UIColor blackColor]; [superView addSubview:blackView]; [superView addSubview:downMenu]; // 动画--首先让menu平移上去
downMenu.transform = CGAffineTransformMakeTranslation(, -(row * ChaosItemWH)); [UIView animateWithDuration:0.5 delay: usingSpringWithDamping:0.3 initialSpringVelocity: options:UIViewAnimationOptionCurveEaseInOut animations:^{ downMenu.transform = CGAffineTransformIdentity; } completion:^(BOOL finished) { [blackView removeFromSuperview]; }];
return downMenu;
} - (void)setUpDivideView
{
// 添加纵向分割线
// 纵向分割线的数目
NSInteger colsViewCount = ChaosCols - ;
// 纵向分割线的xywh
for (int i = ; i <colsViewCount; i++) {
UIView *view = [[UIView alloc] init];
view.frame = CGRectMake((i + ) * ChaosItemWH, , , self.height);
view.backgroundColor = [UIColor whiteColor];
[self addSubview:view];
}
// 添加横向分割线
// 横向分割线条数
NSInteger rowViewCount = (self.items.count - ) / ChaosCols;
for (int i = ; i < rowViewCount; i++) { UIView *view = [[UIView alloc] init];
view.frame = CGRectMake(, (i + ) * ChaosItemWH, self.width, );
view.backgroundColor = [UIColor whiteColor];
[self addSubview:view];
}
} #pragma mark - 添加子控件
- (void)setUpAllBtns:(NSArray *)items
{
for (ChaosMenuItem *item in items) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:item.title forState:UIControlStateNormal];
[btn setImage:item.image forState:UIControlStateNormal];
btn.backgroundColor = [UIColor blackColor];
[self.btnArray addObject:btn];
[self addSubview:btn];
}
} #pragma mark - 布局子控件
- (void)layoutSubviews
{
[super layoutSubviews]; CGFloat x = ;
CGFloat y = ;
for (int i = ; i < self.btnArray.count; i ++) {
UIButton *btn = self.btnArray[i];
int rowNO = i / ChaosCols;
int colsNO = i % ChaosCols;
x = colsNO * ChaosItemWH;
y = rowNO * ChaosItemWH;
btn.frame = CGRectMake(x, y, ChaosItemWH, ChaosItemWH);
}
} @end
iOS彩票项目--第二天,自定义蒙版、封装活动菜单、自定义pop菜单的更多相关文章
- iOS彩票项目--第五天,新特性引导页的封装、返回按钮的自定义、导航控制器的滑动返回以及自定义滑动返回功能
		一.上次实现了在AppDelegate中通过判断app版本决定是否进入新特性页面,今天将AppDelegate中的一坨进行了封装.将self.window的根控制器到底应该为新特性界面,还是主页面,封 ... 
- iOS彩票项目--第一天,自定义TabBar控制器和自定义TabBar,自定义导航控制器
		一.环境配置,和项目层次搭建 二.自定义TabBar 项目中TabBar中的导航按钮美工给的图片太大,图片中包含了图片和文字.最主要的是TabBar上面的按钮图片尺寸是有规定的,当高度大于44的时候, ... 
- iOS彩票项目--第三天,搭建竞技场和发现,搭建幸运选号和我的彩票界面
		一.竞技场搭建--UISegmentedControl的使用 // 重写 自定义控制器的view - (void)loadView { UIImageView *imgView = [[UIImage ... 
- iOS彩票项目--第六天,运用MVC思想搭建设置界面(非storyboard方法)
		一.我只想说封装的思想很重要,MVC的思想也很重要,利用MVC思想搭建一下的界面 先说显示出来的cell,有三种(图中的两种,还有一种是最普通的,没有图片的),这种显示不同的cell,交给模型来处理, ... 
- iOS彩票项目--第四天,新特性界面搭建,UICollectionViewController的初次使用
		一.新特性界面搭建的思路: 在AppDelegate加载主窗体的时候进行判断程序版本号,直接进入程序或者进入新特性展示界面 取出当前的版本号,与旧的版本号相比较(旧的版本号在进入程序的时候存起来 =& ... 
- iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签
		一.初次读取json数据 二.KVC转模型技巧,这里的技巧主要解决的是字典中的key 与 模型中有的属性对应不起来的时候 的解决办法 <方法1> <方法2>运行时字典转模型,运 ... 
- iOS商城demo、音乐播放器、视频通话、自定义搜索、转场动画等源码
		iOS精选源码 微信自定义搜索框实现 一个商城Demo,持续更新中 在Object-C中学习数据结构与算法之排序算法 iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果 XLsn0wPushTimePi ... 
- iOS开源项目周报1222
		由OpenDigg 出品的iOS开源项目周报第二期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. io ... 
- 直接拿来用!最火的iOS开源项目
		1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是G ... 
随机推荐
- 如何在cmd命令行中查看、修改、删除与添加环境变量,语法格式例子:set path;echo %APPDATA%
			如何在cmd命令行中查看.修改.删除与添加环境变量 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改.也就是说当关闭此cmd命令行窗口后,将不再起作用.永久性修 ... 
- UltraEdit打开中文乱码
			http://hellofs.blog.51cto.com/6109153/1187548 UltraEdit很强大,但是今天发现在打开含有中文的文本时会乱码,还是在配置里找找相关的设置,可以在如图的 ... 
- HOJ  1402  整数划分
			HOJ1402 整数划分 http://acm.hit.edu.cn/hoj/problem/view?id=1402 [题目描述] 整数划分是一个经典的问题.希望这道题会对你的组合数学的解题能力有所 ... 
- Android学习系列(2)--App自动更新之通知栏下载
			这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用.1.设计思路,使用VersionCode定义为版本升级参数. android为我们定义版本提供了2个属性:& ... 
- go语言学习 ---iota
			iota iota,特殊常量,可以认为是一个可以被编译器修改的常量. iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota ... 
- android 自定义ViewSwipeBackHelper,实现左滑结束Activity
			https://github.com/Jude95/SwipeBackHelper Git上看到一个基于SwipeBackLayout的实现,可以让我们在使用过程中在不使用物理返回键的情况下舍去了返 ... 
- ps抠图
			*套索工具:简单抠图 *多边形套索工具:简单抠图 *磁性套索工具:可以自动贴着走 *快速选择工具抠图,使用方法:主要控制画笔大小. *魔术棒抠图,使用方法:主要控制容差大小 *钢笔抠图,常见商业抠图 ... 
- openvpn证书吊销
			声明变量source ./vars使用revoke-full命令吊销客户端证书./revoke-full client-name(common name)命令执行后,我们能在keys目录中找到一个文件 ... 
- NGUI UIPanel绘制原理学习
			NGUI底层绘制都是调用UIDrawCall来完成的,它会动态实例化出材质球,改变UV偏移和缩放(图集显示).并且全部是面片 UIPanel也是面片,但是内部物体遮罩比较特殊,经过查找发现,影响UIP ... 
- WIN2008中部署网站后样式及JS加载不了
			今天在一台刚刚装好的WIN2008上部署一个问题,一切按流程来:① 控制面板加IIS,把.NET 3.5打勾② 装.NET 4.0框架③ 装MSSQL2012④ IIS中部署网站⑤ 修改web.con ... 
