
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.
C4D动画曲线编辑辅助插件Grafixer滤镜插件 / 409.86MB / 2018-11-8 / WinAll / / 小编点评:Grafixer是一款为C4D用户.
下载
日文汉字假名注音插件mirigana滤镜插件 / 953.7MB / 2016-4-8 / WinAll / / 小编点评:mirigana是一款可以为你显示推.
下载
StarFuck(屏蔽光驱物理)虚拟光驱 / 201.2MB / 2020-5-30 / WinAll / / 小编点评:有了她,你再也不用拔光驱线玩游戏了!针对.
下载
蝴蝶VIP视频解析软件视频播放 / 370.15MB / 2012-12-12 / WinAll / / 小编点评:蝴蝶视频解析是一款免费实用的vip视.
下载
幻灯片思维导图(NovaMind)行业软件 / 954.17MB / 2023-5-9 / WinAll, WinXP / / 小编点评:带有演示功能的思维导图绘制工具,N.
下载
Google Android SDK开发范例大全第2版源码相关 / 612.40MB / 2017-12-12 / WinXP, WinAll / / 小编点评:买了这本书,找了个移动光驱把随书源码弄出来.
下载
Ideapad Y460/Y560系列触控板驱动下载V14.0.18下载 其他驱动 / 138.42MB / 2022-11-16 / Win8,Win7,WinXP / 简体中文 / 免费软件 小编点评:软件介绍IdeapadY460/Y.
下载
FileRecovery Enterprise 2015(数据恢复工具)V5.5.7.9中文版下载 数据恢复 / 911.36MB / 2018-6-12 / Win10,Win8,Win7,Vista,Win2003,WinXP / 多国语言[中文] / 试用软件 小编点评:软件介绍专题:IE浏览器20年数据恢复软件F.
下载
ABC Amber Outlook Converter V9.29.0.0下载 办公软件 / 717.42MB / 2023-11-5 / Win8,Win7,WinXP / 英文 / 商业软件 小编点评:软件介绍ABCAmberOutlo.
下载
花花公子图片浏览器V2.08下载 图像浏览 / 901.49MB / 2022-12-20 / Win8,Win7,WinXP / 简体中文 / 免费软件 小编点评:软件介绍花花公子图片浏览器是[51115网址]开发.
下载
宏达直管公房收费管理系统V1.0.0.0下载 租借管理 / 620.23MB / 2016-7-16 / Win8,Win7,WinXP / 简体中文 / 免费软件 小编点评:软件介绍《直管公房收费管理系统》是根.
下载
HTML PowerTools V2.14下载 编程开发 / 723.33MB / 2010-11-16 / Win8,Win7,WinXP / 英文 / 免费软件 小编点评:软件介绍HTML代码辅助工具:1.使.
下载
DivX Tech Preview (Window7专用MKV解码包) MKV on-jinwen Window7下载 视频解码 / 808.37MB / 2022-11-2 / Win7 / 英文 / 免费软件 小编点评:软件介绍新的DivXTechPre.
下载
虚化之刃果盘版下载-虚化之刃手游果盘版下载v1.9 官方安卓版
天下统一恋之乱手游-天下统一恋之乱手机版(暂未上线)v3.1.0 官网安卓版
运脉云化工物流官方版下载-运脉云app下载v8.20.0328 安卓版
81890生活通app下载-81890生活通最新版下载v2.0.0 安卓版
一航考研官网下载-一航考研app下载v1.0.1 安卓版
梦游逃生破解版下载-梦游逃生中文破解版下载v1.1.3 安卓版
自由落点游戏下载-自由落点手机版下载v1.0.3 安卓版
镭射危机游戏下载-镭射危机中文版下载v1.0.3 安卓最新版
我不是头猪存钱罐模拟游戏下载-我不是头猪游戏最新版下载v1.0.0 安卓版
仙灵萌主游戏正版下载-仙灵萌主手游官方版下载v1.1.0 安卓版
mj绘画大师官方版下载-mj绘画大师软件下载v1.0.1 安卓版
麦片屏幕翻译手机版下载-麦片屏幕翻译app下载v1.3.00 安卓版
音频工具酷V2.3免费版下载
音频转换 / 579.9MB / 2013-2-17 / Win7,Vista,Win2003,WinXP / 简体中文 / 免费软件 下载
iismui.dll下载
DLL下载 / 926.85MB / 2014-4-9 / Win8,Win7,WinXP / 简体中文 / 免费软件 下载
SysTools AD Console下载-AD管理工具 v1.0
办公软件 / 866.2MB / 2021-12-3 / WinAll / 英文 / 免费软件 下载
深海冒险(暂未上线)
动作闯关 / 431.95MB / 2011-2-2 / Win8,Win7,Vista,WinXP / 英文 / 免费软件 下载
宝贝巴士儿童早教游戏下载-宝贝巴士官方版下载v2.5 安卓版
儿童教育 / 694.64MB / 2019-5-10 / Android / 中文 / 阳江糖芯网络软件有限公司 / v2.5 安卓版 下载
传世英雄h5官方下载-传世英雄手游微变版本下载v1.1 安卓版
h5游戏 / 796.39MB / 2011-1-7 / Android / 中文 / v1.1 安卓版 下载
大嘉erp软件下载-大嘉erp官方版下载v7.0.12 安卓版
商务办公 / 254.99MB / 2010-1-20 / Android / 中文 / 杭州大嘉科技有限公司 / v7.0.12 安卓版 下载
燥点小视频app下载-燥点小视频手机版下载v1.3.0 安卓版
视频播放 / 140.60MB / 2020-8-5 / Android / 中文 / v1.3.0 安卓版 下载
polytone完整破解版下载-polytone音乐全解锁版下载v1.10.5 安卓版
音乐游戏 / 272.44MB / 2018-8-15 / Android / 中文 / v1.10.5 安卓版 下载
花塔防御破解版下载-花塔防御内购破解版下载v1.1 安卓版
策略塔防 / 810.81MB / 2012-9-26 / Android / 中文 / v1.1 安卓版 下载
致死英雄破解版下载-致死英雄无限钻石版下载v1.1.6 安卓版
动作游戏 / 202.42MB / 2022-1-2 / Android / 中文 / v1.1.6 安卓版 下载
斗将手游百度版下载-斗将百度手游平台下载v1.0.9.0.3 官网安卓版
回合网游 / 750.2MB / 2013-9-19 / Android / 中文 / 北京百度网讯科技有限公司 / v1.0.9.0.3 官网安卓版 下载
勇者大冒险破解版下载-勇者大冒险手游破解版下载v5.0.1 安卓版
飞行射击 / 497.25MB / 2020-10-21 / Android / 中文 / v5.0.1 安卓版 下载