亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS上實現的自定義儀表盤示例

2020-07-26 02:57:44
字體:
來源:轉載
供稿:網友

今天給大家帶來一個自定義的儀表盤,效果圖如下。

Demo中用到了 QuartzCore類 首先繼承一個UIView。

// Gauge.h // GaugeDemo // // Created by 海鋒 周 on 12-3-27. // Copyright (c) 2012年 CJLU rights reserved. //  #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h>  @interface Gauge : UIView {   UIImage *gaugeView;   UIImageView *pointer;      CGFloat maxNum;   CGFloat minNum;      CGFloat maxAngle;   CGFloat minAngle;      CGFloat gaugeValue;   CGFloat gaugeAngle;      CGFloat angleperValue;   CGFloat scoleNum;      NSMutableArray *labelArray;   CGContextRef context; }  @property (nonatomic,retain) UIImage *gaugeView; @property (nonatomic,retain) UIImageView *pointer; @property (nonatomic,retain) NSMutableArray *labelArray; @property (nonatomic) CGContextRef context; -(void)setGaugeValue:(CGFloat)value animation:(BOOL)isAnim;  @end

指針的旋轉是通過QuartzCore.framework中的CATransform3DRotate 來實現的,所以一定要記得把框架添加進來。當然在旋轉之前,我們還需要把指針的中心pointer.layer.anchorPoint 移動到你需要的轉動中心。

在設置旋轉動畫的時候,我們用的不是CABaseAnimiation 而是用  CAKeyframeAnimation。這是因為如果使用中的 toValue 來實現旋轉的話,它默認是以最小的旋轉的,如果要實現控制旋轉的方向的話,我們就只能用關鍵幀來設置旋轉的路徑。用關鍵幀的好處還有一個,就是可以給指針添加,旋轉到指定位置以后的左右擺動的效果。

繪制儀表盤是通過Quartz2D來實現的,首先我們需要用UIGraphicsGetCurrentContext函數來獲取一個Context上下文,就是相當于獲取一個畫布。然后就可以在上面通過三角函數的計算,畫出背景圖片,和上面的刻度線了。

// Gauge.m // GaugeDemo // // Created by 海鋒 周 on 12-3-27. // Copyright (c) 2012年 CJLU. All rights reserved. //  #import "Gauge.h" #import <QuartzCore/QuartzCore.h>  #define MAXOFFSETANGLE 120.0f #define POINTEROFFSET 90.0f #define MAXVALUE    120.0f #define CELLMARKNUM  5 #define CELLNUM    12 #define GAUGESTRING  @"單位:Km/h" #define DEFLUATSIZE  300     /************************************************   儀表盤的大小不建議設置的太小。   長寬都是300是最適合的   如果要更小的需要自行修改刻度長度和文字大小               ---powered by 周海鋒                 2012-3-29  ***********************************************/   @implementation Gauge  @interface Gauge (private) - (CGFloat) parseToX:(CGFloat) radius Angle:(CGFloat)angle; - (CGFloat) parseToY:(CGFloat) radius Angle:(CGFloat)angle; - (CGFloat) transToRadian:(CGFloat)angel; - (CGFloat) parseToAngle:(CGFloat) val; - (CGFloat) parseToValue:(CGFloat) val; - (void)setTextLabel:(NSInteger)labelNum; - (void)setLineMark:(NSInteger)labelNum; - (void) pointToAngle:(CGFloat) angle Duration:(CGFloat) duration; @end  @synthesize gaugeView,pointer,context; @synthesize labelArray;  - (id)initWithFrame:(CGRect)frame {   self = [super initWithFrame:frame];   if (self) {     //設置背景透明     [self setBackgroundColor:[UIColor clearColor]];          scoleNum = DEFLUATSIZE/frame.size.width;     maxNum = MAXVALUE;     minNum = 0.0f;     minAngle = -MAXOFFSETANGLE;     maxAngle = MAXOFFSETANGLE;     gaugeValue = 0.0f;     gaugeAngle = -MAXOFFSETANGLE;     angleperValue = (maxAngle - minAngle)/(maxNum - minNum);          gaugeView= [UIImage imageNamed:@"gaugeback.png"];     //添加指針     UIImage *_pointer = [UIImage imageNamed:@"pointer2.png"];     pointer = [[UIImageView alloc] initWithImage:_pointer];     pointer.layer.anchorPoint = CGPointMake(0.5, 0.78);     pointer.center = self.center;     pointer.transform = CGAffineTransformMakeScale(scoleNum, scoleNum);     [self addSubview:pointer];     //設置文字標簽     [self setTextLabel:CELLNUM];     //設置指針到0位置     pointer.layer.transform = CATransform3DMakeRotation([self transToRadian:-MAXOFFSETANGLE], 0, 0, 1);   }   return self; }  /*  * setTextLabel 繪制刻度值  * @labelNum NSInteger 刻度值的數目  */ -(void)setTextLabel:(NSInteger)labelNum {    labelArray = [NSMutableArray arrayWithCapacity:labelNum];      CGFloat textDis = (maxNum - minNum)/labelNum;   CGFloat angelDis = (maxAngle - minAngle)/labelNum;   CGFloat radius = (self.center.x - 75)*scoleNum;   CGFloat currentAngle;   CGFloat currentText = 0.0f;   CGPoint centerPoint = self.center;      for(int i=0;i<=labelNum;i++)   {     currentAngle = minAngle + i * angelDis - POINTEROFFSET;     currentText = minNum + i * textDis;     UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0 , 0 , 30, 50)];     label.autoresizesSubviews = YES;     label.textColor = [UIColor whiteColor];     label.backgroundColor = [UIColor clearColor];     //設置刻度的文字的格式     if(i<labelNum/2){       label.textAlignment = UITextAlignmentLeft;     }else if (i==labelNum/2){       label.textAlignment = UITextAlignmentCenter;     }else{       label.textAlignment = UITextAlignmentRight;     }     label.text = [NSString stringWithFormat:@"%d",(int)currentText];     label.center = CGPointMake(centerPoint.x+[self parseToX:radius Angle:currentAngle],centerPoint.y+[self parseToY:radius Angle:currentAngle]);          [labelArray addObject:label];     [self addSubview:label];       }   // 設置刻度表的名稱   UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0 , 0 ,100, 40)];   label.autoresizesSubviews = YES;   label.textColor = [UIColor whiteColor];   label.backgroundColor = [UIColor clearColor];   label.textAlignment = UITextAlignmentCenter;   label.text = GAUGESTRING;   label.center = CGPointMake(centerPoint.x,centerPoint.y*3/2);   [self addSubview:label];   }  /*  * setLineMark 繪制刻度的標記  * @labelNum NSInteger 刻度是數目  */ -(void)setLineMark:(NSInteger)labelNum {    CGFloat angelDis = (maxAngle - minAngle)/labelNum;   CGFloat radius = self.center.x;   CGFloat currentAngle;   CGPoint centerPoint = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);      for(int i=0;i<=labelNum;i++)   {     currentAngle = minAngle + i * angelDis - POINTEROFFSET;     //給刻度標記繪制不同的顏色     if(i>labelNum*2/3)     {       CGContextSetStrokeColorWithColor(context, [[UIColor colorWithRed:1 green:0 blue:0 alpha:0.8] CGColor]);     }else if(i>labelNum*1/3){       CGContextSetStrokeColorWithColor(context, [[UIColor colorWithRed:1 green:1 blue:0 alpha:0.8] CGColor]);     }else{       CGContextSetStrokeColorWithColor(context, [[UIColor colorWithRed:0 green:1 blue:0 alpha:0.8] CGColor]);     }     //繪制不同的長短的刻度     if(i%5==0)     {          CGContextSetLineCap(context, kCGLineCapSquare);       CGContextSetLineWidth(context, 3);       CGContextStrokePath(context);         CGContextMoveToPoint(context,centerPoint.x+[self parseToX:radius-25*scoleNum Angle:currentAngle], centerPoint.y+[self parseToY:radius-25*scoleNum Angle:currentAngle]);       CGContextAddLineToPoint(context,centerPoint.x+[self parseToX:radius-65*scoleNum Angle:currentAngle], centerPoint.y+[self parseToY:radius-65*scoleNum Angle:currentAngle]);     }else{       CGContextSetLineWidth(context, 2);       CGContextSetLineCap(context, kCGLineCapSquare);       CGContextStrokePath(context);        CGContextMoveToPoint(context,centerPoint.x+[self parseToX:radius-25*scoleNum Angle:currentAngle], centerPoint.y+[self parseToY:radius-25*scoleNum Angle:currentAngle]);       CGContextAddLineToPoint(context,centerPoint.x+[self parseToX:radius-40*scoleNum Angle:currentAngle], centerPoint.y+[self parseToY:radius-40*scoleNum Angle:currentAngle]);       }   } }  /*  * setGaugeValue 移動到某個數值  * @value CGFloat 移動到的數值  * @isAnim BOOL  是否執行動畫  */ -(void)setGaugeValue:(CGFloat)value animation:(BOOL)isAnim {   CGFloat tempAngle = [self parseToAngle:value];   gaugeValue = value;   //設置轉動時間和轉動動畫   if(isAnim){     [self pointToAngle:tempAngle Duration:0.6f];   }else   {     [self pointToAngle:tempAngle Duration:0.0f];   } }  /*  * pointToAngle 按角度旋轉  * @angel CGFloat 角度  * @duration CGFloat 動畫執行時間  */ - (void) pointToAngle:(CGFloat) angle Duration:(CGFloat) duration {   CAKeyframeAnimation *anim=[CAKeyframeAnimation animationWithKeyPath:@"transform"];    NSMutableArray *values=[NSMutableArray array];    anim.duration = duration;   anim.autoreverses = NO;   anim.fillMode = kCAFillModeForwards;   anim.removedOnCompletion= NO;      CGFloat distance = angle/10;   //設置轉動路徑,不能直接用 CABaseAnimation 的toValue,那樣是按最短路徑的,轉動超過180度時無法控制方向   int i = 1;   for(;i<=10;i++){     [values addObject:[NSValue valueWithCATransform3D:CATransform3DRotate(CATransform3DIdentity, [self transToRadian:(gaugeAngle+distance*i)], 0, 0, 1)]];     }   //添加緩動效果    [values addObject:[NSValue valueWithCATransform3D:CATransform3DRotate(CATransform3DIdentity, [self transToRadian:(gaugeAngle+distance*(i))], 0, 0, 1)]];    [values addObject:[NSValue valueWithCATransform3D:CATransform3DRotate(CATransform3DIdentity, [self transToRadian:(gaugeAngle+distance*(i-2))], 0, 0, 1)]];       [values addObject:[NSValue valueWithCATransform3D:CATransform3DRotate(CATransform3DIdentity, [self transToRadian:(gaugeAngle+distance*(i-1))], 0, 0, 1)]];                                          anim.values=values; ;   [pointer.layer addAnimation:anim forKey:@"cubeIn"];      gaugeAngle = gaugeAngle+angle;    }  /*  * parseToX 角度轉弧度  * @angel CGFloat 角度  */ -(CGFloat)transToRadian:(CGFloat)angel {   return angel*M_PI/180; }   /*  * parseToX 根據角度,半徑計算X坐標  * @radius CGFloat 半徑   * @angle CGFloat 角度  */ - (CGFloat) parseToX:(CGFloat) radius Angle:(CGFloat)angle {   CGFloat tempRadian = [self transToRadian:angle];   return radius*cos(tempRadian); }  /*  * parseToY 根據角度,半徑計算Y坐標  * @radius CGFloat 半徑   * @angle CGFloat 角度  */ - (CGFloat) parseToY:(CGFloat) radius Angle:(CGFloat)angle {   CGFloat tempRadian = [self transToRadian:angle];   return radius*sin(tempRadian); }  /*  * parseToAngle 根據數據計算需要轉動的角度  * @val CGFloat 要移動到的數值  */ -(CGFloat) parseToAngle:(CGFloat) val {   //異常的數據   if(val<minNum){     return minNum;   }else if(val>maxNum){     return maxNum;   }   CGFloat temp =(val-gaugeValue)*angleperValue;   return temp; }  /*  * parseToValue 根據角度計算數值  * @val CGFloat 要移動到的角度  */ -(CGFloat) parseToValue:(CGFloat) val {   CGFloat temp=val/angleperValue;   CGFloat temp2=maxNum/2+temp;   if(temp2>maxNum){     return maxNum;   }else if(temp2<maxNum){     return maxNum;   }   return temp2; }  - (void)drawRect:(CGRect)rect  {   //獲取上下文   context = UIGraphicsGetCurrentContext();   //設置背景透明   CGContextSetFillColorWithColor(context,self.backgroundColor.CGColor);   CGContextFillRect(context, rect);   //繪制儀表背景     [[self gaugeView ]drawInRect:self.bounds];   //繪制刻度   [self setLineMark:CELLNUM*CELLMARKNUM];        CGContextStrokePath(context); }  @end 

Demo的下載地址:http://xiazai.VeVB.COm/201701/yuanma/GaugeDemo_jb51.rar

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品av在线| 亚洲女人初尝黑人巨大| 亚洲国产精品电影在线观看| 欧美日韩国产激情| 欧美主播福利视频| 一本色道久久综合亚洲精品小说| 日韩欧美国产激情| 91社区国产高清| 日韩欧美国产骚| 欧美性生交xxxxxdddd| 国产一区二区欧美日韩| 66m—66摸成人免费视频| 成人h视频在线观看播放| 欧美大码xxxx| 成人网在线免费观看| 久久激情五月丁香伊人| 久久色在线播放| 亚洲乱码av中文一区二区| 欧美专区在线观看| 国产免费一区二区三区在线能观看| 欧美日韩xxx| 欧美亚洲国产日韩2020| 久久久久久久久久久人体| 性欧美视频videos6一9| 久久久久久成人| 国产亚洲免费的视频看| 搡老女人一区二区三区视频tv| 欧美日韩中文字幕在线| 国产精品久久久久久久美男| 欧美大片va欧美在线播放| 亚洲大胆人体视频| 久久久亚洲精品视频| 国产精品一区二区在线| 国产欧美va欧美va香蕉在| 欧美日韩国产中字| 中文字幕欧美精品在线| 亚洲精品免费av| 精品国产欧美一区二区五十路| 精品久久久久久久久久久久久| 亚洲精品视频免费在线观看| 午夜免费在线观看精品视频| 久久伊人免费视频| 538国产精品一区二区免费视频| 欧美激情久久久| 亚洲国产91精品在线观看| 国产精品ⅴa在线观看h| 成人春色激情网| 久久天天躁狠狠躁老女人| 国产精品久久久久久婷婷天堂| 成人精品在线视频| 欧美人交a欧美精品| 日韩电影大片中文字幕| 国产精品久久久久不卡| 国精产品一区一区三区有限在线| 久久九九国产精品怡红院| 亚洲成色999久久网站| 亚洲女人被黑人巨大进入al| 秋霞午夜一区二区| 欧美中文在线视频| 欧美电影在线观看完整版| 日韩精品在线免费播放| 国产午夜精品美女视频明星a级| 欧美中文字幕在线视频| 91精品国产电影| 日韩电影第一页| 成人性生交大片免费看视频直播| 久久久天堂国产精品女人| 18性欧美xxxⅹ性满足| zzjj国产精品一区二区| 2018国产精品视频| 久久久久久久影视| 国产精品一区二区3区| 91久久精品日日躁夜夜躁国产| 国产精品入口尤物| 欧美精品激情blacked18| 性欧美xxxx| 一本色道久久88精品综合| 国产一区深夜福利| 欧美精品成人在线| 国产精品一区二区3区| 欧美在线不卡区| 欧美激情视频在线观看| 亚洲欧洲在线播放| 久久免费视频在线观看| 久久免费观看视频| 亚洲午夜精品久久久久久性色| 在线看福利67194| 丝袜美腿亚洲一区二区| 久久91精品国产| 国产亚洲精品久久| 日产精品久久久一区二区福利| 91久久国产婷婷一区二区| 日韩精品黄色网| 日韩在线视频观看正片免费网站| 日韩毛片在线看| 色综合久久88| 国产在线98福利播放视频| 国产一区二区三区日韩欧美| 两个人的视频www国产精品| 精品久久久久久久久中文字幕| 久久久国产成人精品| 精品丝袜一区二区三区| 亚洲精品在线观看www| 国产欧洲精品视频| 4p变态网欧美系列| 精品国产鲁一鲁一区二区张丽| 久久久久久有精品国产| 亚洲女人被黑人巨大进入al| 欧美亚洲在线播放| 久久偷看各类女兵18女厕嘘嘘| 欧美激情性做爰免费视频| 91精品国产乱码久久久久久蜜臀| 中文字幕在线看视频国产欧美在线看完整| 久久综合伊人77777蜜臀| 国产精品入口免费视| 中文字幕在线观看日韩| www.久久久久| 欧美日韩中文字幕在线| 中文字幕亚洲综合久久| 国产综合色香蕉精品| 成人美女免费网站视频| 国产精品旅馆在线| 日韩高清电影免费观看完整| 色视频www在线播放国产成人| 国产一区深夜福利| 久久99精品久久久久久青青91| 国产一区红桃视频| 欧美自拍大量在线观看| 久久精品视频在线| 日韩经典中文字幕在线观看| 成人乱人伦精品视频在线观看| 久久久久久这里只有精品| 久久久久久久一区二区| 亚洲国产日韩欧美综合久久| 久久久999精品免费| 中文字幕亚洲第一| 国产精品久久久久久久久久久不卡| 亚洲天堂av网| 亚洲精品久久在线| 亚洲图片在区色| 国产成人午夜视频网址| 欧美日韩视频在线| 精品亚洲一区二区三区在线播放| 国产精品丝袜白浆摸在线| 亚洲国产精品成人av| 日本精品视频在线| 97在线免费观看| 一区二区三区美女xx视频| 久久99国产精品自在自在app| 最新日韩中文字幕| 91av免费观看91av精品在线| 国产精品久久久久久亚洲调教| 国产欧美日韩亚洲精品| 成人性生交大片免费看小说| 欧美日韩另类字幕中文| 国产精品爱久久久久久久| 久久成人国产精品| 欧美激情免费看| 欧美日韩国产丝袜美女| 日韩性生活视频| 欧美一区二区三区图| 久久人人爽人人爽人人片亚洲| 国产午夜精品一区理论片飘花| 日韩av快播网址|