
IOS扩展QuadCurveMenu,实现了八个方向上的弹出菜单
说明:
最近在看一些开源项目,其中有一个弹出菜单QuadCurveMenu觉得挺不错,可惜只可以向右上角弹出菜单,于是就修改了下,实现了八个方向的弹出菜单,现在发上来供大家批评指正。
源码:
[cpp]viewplaincopy////QuadCurveMenu.h//AwesomeMenu////CreatedbyLeveyon11/30/11.//Copyright(c)2011Lunaapp.com.Allrightsreserved.//#import<UIKit/UIKit.h#import"QuadCurveMenuItem.h"@protocolQuadCurveMenuDelegate;//defulttypeislikethis/**O*O*O*O*0O*/typedefenum{QuadCurveMenuTypeUpAndRight=0,QuadCurveMenuTypeUpAndLeft,QuadCurveMenuTypeDownAndRight,QuadCurveMenuTypeDownAndLeft,QuadCurveMenuTypeUp,QuadCurveMenuTypeDown,QuadCurveMenuTypeLeft,QuadCurveMenuTypeRight,QuadCurveMenuTypeDefault=QuadCurveMenuTypeUpAndRight}QuadCureMenuType;@interfaceQuadCurveMenu:UIView<QuadCurveMenuItemDelegate{NSArray*_menusArray;int_flag;NSTimer*_timer;QuadCurveMenuItem*_addButton;QuadCureMenuType_type;id<QuadCurveMenuDelegate_delegate;CGPoint_startPoint;}@property(nonatomic,copy)NSArray*menusArray;@property(nonatomic)QuadCureMenuTypetype;@property(nonatomic,getter=isExpanding)BOOLexpanding;@property(nonatomic,assign)id<QuadCurveMenuDelegatedelegate;-(id)initWithFrame:(CGRect)framemenus:(NSArray*)aMenusArray;-(void)setType:(QuadCureMenuType)type;-(void)setStartPoint:(CGPoint)startpoint;@end@protocolQuadCurveMenuDelegate<NSObject-(void)quadCurveMenu:(QuadCurveMenu*)menudidSelectIndex:(NSInteger)idx;@end[cpp]viewplaincopy////QuadCurveMenu.m//AwesomeMenu////CreatedbyLeveyon11/30/11.//Copyright(c)2011Lunaapp.com.Allrightsreserved.//#import"QuadCurveMenu.h"#import<QuartzCore/QuartzCore.h#defineNEARRADIUS130.0f#defineENDRADIUS140.0f#defineFARRADIUS160.0f#defineBETWEENADIUS50.0f#defineSTARTPOINTCGPointMake(100,130)#defineTIMEOFFSET0.05f@interfaceQuadCurveMenu()-(void)_expand;-(void)_close;-(CAAnimationGroup*)_blowupAnimationAtPoint:(CGPoint)p;-(CAAnimationGroup*)_shrinkAnimationAtPoint:(CGPoint)p;@end@implementationQuadCurveMenu@synthesizeexpanding=_expanding;@synthesizedelegate=_delegate;@synthesizemenusArray=_menusArray;@synthesizetype=_type;#pragmamark-initialization&cleaningup-(id)initWithFrame:(CGRect)framemenus:(NSArray*)aMenusArray{self=[superinitWithFrame:frame];if(self){self.backgroundColor=[UIColorclearColor];_startPoint=STARTPOINT;_menusArray=[aMenusArraycopy];//addthemenubuttonsintcount=[_menusArraycount];for(inti=0;i<count;i++){QuadCurveMenuItem*item=[_menusArrayobjectAtIndex:i];item.tag=1000+i;item.startPoint=STARTPOINT;item.endPoint=CGPointMake(_startPoint.x+ENDRADIUS*sinf(i*M_PI_2/(count-1)),_startPoint.y-ENDRADIUS*cosf(i*M_PI_2/(count-1)));item.nearPoint=CGPointMake(_startPoint.x+NEARRADIUS*sinf(i*M_PI_2/(count-1)),_startPoint.y-NEARRADIUS*cosf(i*M_PI_2/(count-1)));item.farPoint=CGPointMake(_startPoint.x+FARRADIUS*sinf(i*M_PI_2/(count-1)),_startPoint.y-FARRADIUS*cosf(i*M_PI_2/(count-1)));item.center=item.startPoint;item.delegate=self;[selfaddSubview:item];}//addthe"Add"Button._addButton=[[QuadCurveMenuItemalloc]initWithImage:[UIImageimageNamed:@"story-add-button.png"]highlightedImage:[UIImageimageNamed:@"story-add-button-pressed.png"]ContentImage:[UIImageimageNamed:@"story-add-plus.png"]highlightedContentImage:[UIImageimageNamed:@"story-add-plus-pressed.png"]];_addButton.delegate=self;_addButton.center=_startPoint;[selfaddSubview:_addButton];}returnself;}-(void)setType:(QuadCureMenuType)type{_type=type;intdx=1;intdy=1;BOOLisTwoDirctions=YES;if(_menusArray!=nil){switch(type){caseQuadCurveMenuTypeUpAndRight:break;caseQuadCurveMenuTypeUpAndLeft:dx=-1;break;caseQuadCurveMenuTypeDownAndRight:dy=-1;break;caseQuadCurveMenuTypeDownAndLeft:dy=dx=-1;break;caseQuadCurveMenuTypeUp:isTwoDirctions=NO;dx=0;dy=-1;break;caseQuadCurveMenuTypeDown:isTwoDirctions=NO;dx=0;dy=1;break;caseQuadCurveMenuTypeLeft:isTwoDirctions=NO;dx=-1;dy=0;break;caseQuadCurveMenuTypeRight:isTwoDirctions=NO;dx=1;dy=0;default:break;}intcount=[_menusArraycount];for(inti=0;i<count;i++){QuadCurveMenuItem*item=[_menusArrayobjectAtIndex:i];item.startPoint=_startPoint;if(isTwoDirctions){item.endPoint=CGPointMake(_startPoint.x+dx*ENDRADIUS*sinf(i*M_PI_2/(count-1)),_startPoint.y-dy*ENDRADIUS*cosf(i*M_PI_2/(count-1)));item.nearPoint=CGPointMake(_startPoint.x+dx*NEARRADIUS*sinf(i*M_PI_2/(count-1)),_startPoint.y-dy*NEARRADIUS*cosf(i*M_PI_2/(count-1)));item.farPoint=CGPointMake(_startPoint.x+dx*FARRADIUS*sinf(i*M_PI_2/(count-1)),_startPoint.y-dy*FARRADIUS*cosf(i*M_PI_2/(count-1)));}else{item.endPoint=CGPointMake(_startPoint.x+dx*i*BETWEENADIUS,_startPoint.y+dy*i*BETWEENADIUS);item.nearPoint=CGPointMake(_startPoint.x+dx*i*(BETWEENADIUS-15),_startPoint.y+dy*i*(BETWEENADIUS-15));item.farPoint=CGPointMake(_startPoint.x+dx*i*(BETWEENADIUS+20),_startPoint.y+dy*i*(BETWEENADIUS+20));}item.center=item.startPoint;}}}-(void)setStartPoint:(CGPoint)startpoint{_startPoint=startpoint;_addButton.center=_startPoint;[selfsetType:_type];};-(void)dealloc{[_addButtonrelease];[_menusArrayrelease];[superdealloc];}#pragmamark-UIView'smethods-(BOOL)pointInside:(CGPoint)pointwithEvent:(UIEvent*)event{//ifthemenustateisexpanding,everywherecanbetouch//otherwise,onlytheaddbuttonarecanbetouchif(YES==_expanding){returnYES;}else{returnCGRectContainsPoint(_addButton.frame,point);}}-(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event{self.expanding=!self.isExpanding;}#pragmamark-QuadCurveMenuItemdelegates-(void)quadCurveMenuItemTouchesBegan:(QuadCurveMenuItem*)item{if(item==_addButton){self.expanding=!self.isExpanding;}}-(void)quadCurveMenuItemTouchesEnd:(QuadCurveMenuItem*)item{//excludethe"add"buttonif(item==_addButton){return;}//blowuptheselectedmenubuttonCAAnimationGroup*blowup=[self_blowupAnimationAtPoint:item.center];[item.layeraddAnimation:blowupforKey:@"blowup"];item.center=item.startPoint;//shrinkothermenubuttonsfor(inti=0;i<[_menusArraycount];i++){QuadCurveMenuItem*otherItem=[_menusArrayobjectAtIndex:i];CAAnimationGroup*shrink=[self_shrinkAnimationAtPoint:otherItem.center];if(otherItem.tag==item.tag){continue;}[otherItem.layeraddAnimation:shrinkforKey:@"shrink"];otherItem.center=otherItem.startPoint;}_expanding=NO;//rotate"add"buttonfloatangle=self.isExpanding?-M_PI_4:0.0f;[UIViewanimateWithDuration:0.2fanimations:^{_addButton.transform=CGAffineTransformMakeRotation(angle);}];if([_delegaterespondsToSelector:@selector(quadCurveMenu:didSelectIndex:)]){[_delegatequadCurveMenu:selfdidSelectIndex:item.tag-1000];}}#pragmamark-instantmethods-(void)setMenusArray:(NSArray*)aMenusArray{if(aMenusArray==_menusArray){return;}[_menusArrayrelease];_menusArray=[aMenusArraycopy];//cleansubviewsfor(UIView*vinself.subviews){if(v.tag=1000){[vremoveFromSuperview];}}//addthemenubuttonsintcount=[_menusArraycount];for(inti=0;i<count;i++){QuadCurveMenuItem*item=[_menusArrayobjectAtIndex:i];item.tag=1000+i;item.startPoint=_startPoint;item.endPoint=CGPointMake(_startPoint.x+ENDRADIUS*sinf(i*M_PI_2/(count-1)),_startPoint.y-ENDRADIUS*cosf(i*M_PI_2/(count-1)));item.nearPoint=CGPointMake(_startPoint.x+NEARRADIUS*sinf(i*M_PI_2/(count-1)),_startPoint.y-NEARRADIUS*cosf(i*M_PI_2/(count-1)));item.farPoint=CGPointMake(_startPoint.x+FARRADIUS*sinf(i*M_PI_2/(count-1)),_startPoint.y-FARRADIUS*cosf(i*M_PI_2/(count-1)));item.center=item.startPoint;item.delegate=self;[selfaddSubview:item];}}-(BOOL)isExpanding{return_expanding;}-(void)setExpanding:(BOOL)expanding{_expanding=expanding;//rotateaddbuttonfloatangle=self.isExpanding?-M_PI_4:0.0f;[UIViewanimateWithDuration:0.2fanimations:^{_addButton.transform=CGAffineTransformMakeRotation(angle);}];//expandorcloseanimationif(!_timer){_flag=self.isExpanding?0:5;SELselector=self.isExpanding?@selector(_expand):@selector(_close);_timer=[[NSTimerscheduledTimerWithTimeInterval:TIMEOFFSETtarget:selfselector:selectoruserInfo:nilrepeats:YES]retain];}}#pragmamark-privatemethods-(void)_expand{if(_flag==6){[_timerinvalidate];[_timerrelease];_timer=nil;return;}inttag=1000+_flag;QuadCurveMenuItem*item=(QuadCurveMenuItem*)[selfviewWithTag:tag];CAKeyframeAnimation*rotateAnimation=[CAKeyframeAnimationanimationWithKeyPath:@"transform.rotation.z"];rotateAnimation.values=[NSArrayarrayWithObjects:[NSNumbernumberWithFloat:M_PI],[NSNumbernumberWithFloat:0.0f],nil];rotateAnimation.duration=0.5f;rotateAnimation.keyTimes=[NSArrayarrayWithObjects:[NSNumbernumberWithFloat:.3],[NSNumbernumberWithFloat:.4],nil];CAKeyframeAnimation*positionAnimation=[CAKeyframeAnimationanimationWithKeyPath:@"position"];positionAnimation.duration=0.5f;CGMutablePathRefpath=CGPathCreateMutable();CGPathMoveToPoint(path,NULL,item.startPoint.x,item.startPoint.y);CGPathAddLineToPoint(path,NULL,item.farPoint.x,item.farPoint.y);CGPathAddLineToPoint(path,NULL,item.nearPoint.x,item.nearPoint.y);CGPathAddLineToPoint(path,NULL,item.endPoint.x,item.endPoint.y);positionAnimation.path=path;CGPathRelease(path);CAAnimationGroup*animationgroup=[CAAnimationGroupanimation];animationgroup.animations=[NSArrayarrayWithObjects:positionAnimation,rotateAnimation,nil];animationgroup.duration=0.5f;animationgroup.fillMode=kCAFillModeForwards;animationgroup.timingFunction=[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseIn];[item.layeraddAnimation:animationgroupforKey:@"Expand"];item.center=item.endPoint;_flag++;}-(void)_close{if(_flag==-1){[_timerinvalidate];[_timerrelease];_timer=nil;return;}inttag=1000+_flag;QuadCurveMenuItem*item=(QuadCurveMenuItem*)[selfviewWithTag:tag];CAKeyframeAnimation*rotateAnimation=[CAKeyframeAnimationanimationWithKeyPath:@"transform.rotation.z"];rotateAnimation.values=[NSArrayarrayWithObjects:[NSNumbernumberWithFloat:0.0f],[NSNumbernumberWithFloat:M_PI*2],[NSNumbernumberWithFloat:0.0f],nil];rotateAnimation.duration=0.5f;rotateAnimation.keyTimes=[NSArrayarrayWithObjects:[NSNumbernumberWithFloat:.0],[NSNumbernumberWithFloat:.4],[NSNumbernumberWithFloat:.5],nil];CAKeyframeAnimation*positionAnimation=[CAKeyframeAnimationanimationWithKeyPath:@"position"];positionAnimation.duration=0.5f;CGMutablePathRefpath=CGPathCreateMutable();CGPathMoveToPoint(path,NULL,item.endPoint.x,item.endPoint.y);CGPathAddLineToPoint(path,NULL,item.farPoint.x,item.farPoint.y);CGPathAddLineToPoint(path,NULL,item.startPoint.x,item.startPoint.y);positionAnimation.path=path;CGPathRelease(path);CAAnimationGroup*animationgroup=[CAAnimationGroupanimation];animationgroup.animations=[NSArrayarrayWithObjects:positionAnimation,rotateAnimation,nil];animationgroup.duration=0.5f;animationgroup.fillMode=kCAFillModeForwards;animationgroup.timingFunction=[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseIn];[item.layeraddAnimation:animationgroupforKey:@"Close"];item.center=item.startPoint;_flag--;}-(CAAnimationGroup*)_blowupAnimationAtPoint:(CGPoint)p{CAKeyframeAnimation*positionAnimation=[CAKeyframeAnimationanimationWithKeyPath:@"position"];positionAnimation.values=[NSArrayarrayWithObjects:[NSValuevalueWithCGPoint:p],nil];positionAnimation.keyTimes=[NSArrayarrayWithObjects:[NSNumbernumberWithFloat:.3],nil];CABasicAnimation*scaleAnimation=[CABasicAnimationanimationWithKeyPath:@"transform"];scaleAnimation.toValue=[NSValuevalueWithCATransform3D:CATransform3DMakeScale(3,3,1)];CABasicAnimation*opacityAnimation=[CABasicAnimationanimationWithKeyPath:@"opacity"];opacityAnimation.toValue=[NSNumbernumberWithFloat:0.0f];CAAnimationGroup*animationgroup=[CAAnimationGroupanimation];animationgroup.animations=[NSArrayarrayWithObjects:positionAnimation,scaleAnimation,opacityAnimation,nil];animationgroup.duration=0.3f;animationgroup.fillMode=kCAFillModeForwards;returnanimationgroup;}-(CAAnimationGroup*)_shrinkAnimationAtPoint:(CGPoint)p{CAKeyframeAnimation*positionAnimation=[CAKeyframeAnimationanimationWithKeyPath:@"position"];positionAnimation.values=[NSArrayarrayWithObjects:[NSValuevalueWithCGPoint:p],nil];positionAnimation.keyTimes=[NSArrayarrayWithObjects:[NSNumbernumberWithFloat:.3],nil];CABasicAnimation*scaleAnimation=[CABasicAnimationanimationWithKeyPath:@"transform"];scaleAnimation.toValue=[NSValuevalueWithCATransform3D:CATransform3DMakeScale(.01,.01,1)];CABasicAnimation*opacityAnimation=[CABasicAnimationanimationWithKeyPath:@"opacity"];opacityAnimation.toValue=[NSNumbernumberWithFloat:0.0f];CAAnimationGroup*animationgroup=[CAAnimationGroupanimation];animationgroup.animations=[NSArrayarrayWithObjects:positionAnimation,scaleAnimation,opacityAnimation,nil];animationgroup.duration=0.3f;animationgroup.fillMode=kCAFillModeForwards;returnanimationgroup;}@end
Tags:IOS.
WIFI共享软件(lazy WiFi)网络共享 / 750.88MB / 2021-7-1 / WinAll / / 小编点评:lazyWiFii是一款免费的能够帮.
下载
2017NBA全明星扣篮大赛视频回放平台视频播放 / 159.96MB / 2023-5-1 / WinAll, WinXP, Win7, win8 / / 小编点评:2017年的NBA全明星正赛今天上午已经结.
下载
McAfee Labs Stinger 迈克菲杀毒软件其它杀软 / 429.78MB / 2014-11-19 / WinXP, WinAll / / 小编点评:想必友友们电脑里有装过动辄几百兆的杀.
下载
电脑屏幕尺桌面工具 / 730.91MB / 2020-8-8 / WinAll, WinXP, Win7 / / 小编点评:电脑屏幕尺是一款显示在电脑桌面上的屏幕.
下载
企鹅梦物语FC修改器修改器(游戏工具) / 656.55MB / 2015-4-18 / WinAll, WinXP, Win7 / / 小编点评:企鹅梦物语修改器是同名游戏的作弊器工具,
下载
房租婆QQ表情包QQ表情 / 889.61MB / 2013-2-5 / WinAll, Win7 / / 小编点评:非常搞笑的房租婆QQ表情包,很喜欢.
下载
多功能通讯录邮箱工具 / 298.62MB / 2016-9-24 / Win2003, WinXP, Win2000, Win9X / / 小编点评:多功能通讯录2.0.1使用说明:1、.
下载
Alternate Math Solver数学解算器教育学习 / 668.4MB / 2019-10-8 / WinAll / / 小编点评:AlternateMathSolv.
下载
美图秀秀20100329摇头娃娃素材包图片素材 / 968.12MB / 2022-10-20 / WinAll, WinXP / / 美图秀秀 / 小编点评:美图秀秀20100329娃娃素材包.
下载
chrome标签页管理插件Toby浏览辅助 / 409.55MB / 2011-6-1 / WinAll / / 小编点评:Toby是一款用于管理chrome标签.
下载
圆圆打字高手V3.0.0.0下载 电脑学习 / 180.11MB / 2021-6-23 / Win8,Win7,WinXP / 简体中文 / 免费软件 小编点评:软件介绍圆圆打字高手是一款打字练习及测试软.
下载
瑞易视频相册(视频相册制作软件)V2.2下载 图片处理 / 293.25MB / 2022-6-16 / Win8,Win7,WinXP / 简体中文 / 免费软件 小编点评:软件介绍瑞易视频相册自带一个万能M.
下载
宏达法院收付款管理系统V5.0.15.9493下载 财务管理 / 521.70MB / 2017-5-16 / Win8,Win7,WinXP / 简体中文 / 商业软件 小编点评:软件介绍本软件是专门为法院部门管理本单.
下载
手指召唤师游戏下载-手指召唤师菲巴萨莫下载v1.0.5 安卓版
阿拉德之路官方-阿拉德之路手游(暂未上线)v1.37.1.211795 安卓最新版本
ar距离测量仪app下载-ar距离测量仪手机版下载v1.2.7 安卓版
保卫珍珠港中文版下载-保卫珍珠港游戏下载v1.2.6 安卓汉化版
泡泡总动员加强版下载-泡泡总动员手机版下载v1.2.5 安卓最新版
100教育一对一辅导下载-100教育一对一辅导专家下载v3.10.2 安卓版
全城无忧app下载-全城无忧客户端下载v1.0.2 安卓版
社会人传奇bt变态版下载-社会人传奇超v版手游下载v1.2.0 安卓飞升版
飞英环保手机版下载-飞英环保app下载v1.1.0 安卓版
汽水星座馆软件下载-汽水星座app下载v1.3.7 安卓手机版
个税计算器pro版官方下载安装-个税计算器pro软件(改名新个税计算器)下载v1.1.3 安卓最新版
华西云课堂app安卓下载安装-华西云课堂官方版下载v1.3.14 安卓版
网趣网上购物系统时尚版V14.0下载
程序源码 / 351.34MB / 2016-5-22 / Win8,Win7,WinXP / 简体中文 / 免费软件 下载
淘宝刷动态评分软件V4.2.9下载
进销存软件 / 323.75MB / 2014-7-15 / Win8,Win7,WinXP / 简体中文 / 试用软件 下载
Wave flow(音频编辑软件)V5.8免费版下载
音频处理 / 513.41MB / 2018-9-27 / Win7,Vista,Win2003,WinXP / 英文 / 共享软件 下载
PE文件读写工具下载-PE文件读写软件 v12.26 绿色版
文件管理 / 126.51MB / 2022-11-18 / WinAll / 简体中文 / 免费软件 下载
好实再增客系统app下载-好实再增客系统 v4.2.2 手机版
生活服务 / 619.69MB / 2020-6-30 / / 下载
新浪万剑辅助工具V2.3.5免费版下载
游戏辅助 / 219.86MB / 2018-9-6 / Win10,Win8,Win7,WinXP,Win2000 / 简体中文 / 免费软件 下载
爱心对对碰(暂未上线)
智力游戏 / 814.24MB / 2021-2-6 / Win8,Win7,Vista,WinXP / 英文 / 免费软件 下载
空之岛失落王国官方下载-空之岛失落王国手游下载v1.01.013 安卓版
角色扮演 / 16.34MB / 2013-3-1 / Android / 中文 / 本星工作室 / v1.01.013 安卓版 下载
乐高得宝世界免费下载-乐高得宝世界游戏下载v2.6.1 安卓版
儿童教育 / 254.13MB / 2022-10-5 / Android / 中文 / v2.6.1 安卓版 下载
宝宝爱识物学英语游戏下载-宝宝爱识物学英语最新版下载v1.0.0 安卓版
儿童教育 / 857.5MB / 2016-1-11 / Android / 中文 / 丙文科技(唐山)有限责任公司 / v1.0.0 安卓版 下载
动物狂欢派对官方版下载-动物狂欢派对游戏下载v1.0 安卓版
益智休闲 / 15.29MB / 2010-5-8 / Android / 中文 / 武汉市乃乐奇网络科技有限公司 / v1.0 安卓版 下载
feelunique下载安卓-feelunique中文官方版下载v3.2.0 安卓版
网络购物 / 76.37MB / 2016-8-4 / Android / 中文 / 深圳市海豚村信息技术有限公司 / v3.2.0 安卓版 下载
分钟视频官网下载-分钟视频app下载v1.1.33 安卓版
视频播放 / 67.36MB / 2016-1-27 / Android / 中文 / v1.1.33 安卓版 下载