自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解iPhone SDK開發(fā)基礎之自定義儀表控件

移動開發(fā) iOS
控件使用兩個UIView來實現(xiàn)儀表控件,并通過CGAffineTransform類來實現(xiàn)儀表指針的旋轉,控件在UIDialView類中實現(xiàn),來看本文如何定義UIDialView類的。

iPhone SDK開發(fā)基礎之自定義儀表控件是本文要介紹的內(nèi)容,主要是來學習儀表控件。在iOS開發(fā)中,因為程序的需要,有時要自行繪制iPhone SDK沒有提供的界面控件,通常使用QuartzCore.framework即可畫出你所需要的各種圖形,在這里我們實現(xiàn)一個圓形的“儀表盤”控件,控件的外觀如圖3-48所示,用戶可以通過旋轉儀表控件的指針來設置程序需要的各種系統(tǒng)參數(shù),如圖所示:

詳解iPhone SDK開發(fā)基礎之自定義儀表控件

控件使用兩個UIView來實現(xiàn)儀表控件,并通過CGAffineTransform類來實現(xiàn)儀表指針的旋轉,控件在UIDialView類中實現(xiàn),UIDialView類的定義如下。

  1. //  UIDialView.h  
  2. #import <UIKit/UIKit.h> 
  3.  
  4. @protocol UIDialViewDelegate  
  5. @optional  
  6. - (void)dialValue:(int)tag Value:(float)value;  
  7. @end  
  8.  
  9. @interface UIDialView : UIView {  
  10.  id<UIDialViewDelegate> delegate;  
  11.  NSTimer *timer;  
  12.  UIImageView *iv;  
  13.  float maxValue,minValue;  
  14.  CGAffineTransform initialTransform ;  
  15.  float currentValue;  
  16. }  
  17. @property(nonatomic,assign)id<UIDialViewDelegate>delegate;  
  18. @property CGAffineTransform initialTransform;  
  19. @property float currentValue;  
  20.  
  21. @end 

在UIDialView類的實現(xiàn)文件中,通過init()方法讀取圖片文件初始化控件背景和指針,代碼如下。

  1. //  UIDialView.m  
  2. #import "UIDialView.h"  
  3.  
  4. @interface  
  5.  
  6. UIDialView()  
  7. -(void)spin:(NSTimer *)timer;  
  8. -(float) goodDegrees:(float)degrees;  
  9. @end  
  10.  
  11. #define degreesToRadians(degrees) (M_PI * degrees / 180.0)  
  12. #define radiansToDegrees(radians) (radians * 180 / M_PI)  
  13.  
  14. static CGPoint delta;  
  15. static float deltaAngle;  
  16. static float currentAngle;  
  17.  
  18. @implementation UIDialView  
  19. @synthesize initialTransform,currentValue;  
  20.  
  21. - (void)dealloc {  
  22.  [iv release];  
  23.     [super dealloc];  
  24. }  
  25.  
  26. @synthesize  
  27.  
  28. delegate;  
  29.  
  30. - (id)init{  
  31.     if ((self = [super init])) {  
  32.     
  33.   self.userInteractionEnabled = YES;  
  34.   iv =[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"knob. png"]];  
  35.     
  36.   UIImage *backgroundTile = [UIImage imageNamed: @"clock.png"];  
  37.   UIColor *backgroundPattern = [[UIColor alloc] initWithPatternImage: backgroundTile];  
  38.   self.contentMode = UIViewContentModeCenter;  
  39.   [self setBackgroundColor:backgroundPattern];  
  40.   [backgroundPattern release];    
  41.     
  42.   iv.backgroundColor = [UIColor clearColor];   
  43.   iv.autoresizesSubviewsYES;    
  44.   self.frame = CGRectMake(0, 0, iv.frame.size.width, iv.frame.size. height);  
  45.     
  46.   [self addSubview:iv];    
  47.   [self bringSubviewToFront:iv];  
  48.   [iv release];  
  49.     
  50.   currentValue = 0;  
  51.   currentAngle = 0;   
  52.   deltaAngle = 0.0;    
  53.  }  
  54.     return self;  

在UIView的touchesBegan()方法中捕獲用戶Touch點的位置,并根據(jù)此位置使用atan2()函數(shù)計算出控件的初始化角度,代碼如下。

  1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{  
  2.  UITouch *thisTouch = [touches anyObject];  
  3.  delta = [thisTouch locationInView:self];  
  4.    
  5.  float dx = delta.x  - iv.center.x;  
  6.  float dy = delta.y  - iv.center.y;  
  7.  deltaAngle = atan2(dy,dx);  
  8.  initialTransform = iv.transform;  

在用戶的旋轉過程中通過設置指針UIView對象的transform屬性實現(xiàn)儀表控件指針伴隨用戶手指的旋轉而旋轉,代碼如下。

  1. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{  
  2.  UITouch *touch = [touches anyObject];  
  3.  CGPoint pt = [touch locationInView:self];  
  4.    
  5.  float dx = pt.x  - iv.center.x;  
  6.  float dy = pt.y  - iv.center.y;  
  7.  float ang = atan2(dy,dx);  
  8.     
  9.  if (deltaAngle == 0.0) {  
  10.   deltaAngle = ang;  
  11.   initialTransform = iv.transform;    
  12.  }else{  
  13.   float angleDif = deltaAngle - ang;  
  14.   CGAffineTransform newTrans = CGAffineTransformRotate(initialTransform, -angleDif);  
  15.   iv.transform = newTrans;  
  16.  
  17.   float diffValue = [self goodDegrees:radiansToDegrees(angleDif)];    
  18.   currentValue = maxValue - ((maxValue - minValue)/300)*diffValue;  
  19.   if(currentValue > 100) currentValue = 100;  
  20.  }   
  21.  if (delegate != nil) {  
  22.   [delegate dialValue:self.tag Value:currentValue];  
  23.  }  

客戶通過實現(xiàn)UIDialViewDelegate接口協(xié)議的dialValue()方法而得到控件的通知消息,代碼如下。

  1. //  DialViewController.h  
  2. #import <UIKit/UIKit.h> 
  3. #import "UIDialView.h"  
  4.  
  5. @interface  
  6.  
  7. DialViewController : UIViewController< UIDialViewDelegate> {  
  8.    UIDialView *dialView;  
  9.    UILabel *myLabel;  
  10. }  
  11.  
  12. - (void)dialValue:(int)tag Value:(float)value{  
  13.  NSString *str = [NSString stringWithFormat:@"%.1f",v*100];  
  14.     [myLabel performSelector:@selector(setText:) withObject:str];  

小結:詳解iPhone SDK開發(fā)基礎之自定義儀表控件的內(nèi)容介紹完了,希望通過本文的的學習能對你有所幫助!

責任編輯:zhaolei 來源: 博客園
相關推薦

2009-08-06 09:18:01

ASP.NET自定義控ASP.NET控件開發(fā)

2009-08-06 17:52:45

ASP.NET控件開發(fā)自定義控件

2011-08-02 11:17:13

iOS開發(fā) View

2009-06-08 20:13:36

Eclipse自定義控

2009-08-07 11:12:58

ASP.NET控件開發(fā)

2011-07-18 14:39:53

iPhone SDK UIKit

2011-04-19 10:33:16

ASP.NET自定義控

2011-08-18 10:02:47

iPhone SDKOpenFlow

2011-08-18 09:52:13

iPhone SDKUIPageContr

2011-07-05 18:51:51

QT 控件 鼠標

2013-05-20 17:33:44

Android游戲開發(fā)自定義View

2015-02-11 17:49:35

Android源碼自定義控件

2021-08-16 14:45:38

鴻蒙HarmonyOS應用

2021-08-25 10:14:51

鴻蒙HarmonyOS應用

2011-08-11 11:51:07

iPhone鍵盤

2009-07-31 10:23:09

ASP.NET源碼DateTimePic

2021-09-06 14:58:23

鴻蒙HarmonyOS應用

2011-07-18 09:35:29

iPhone 框架

2009-07-28 09:32:41

ASP.NET自定義控

2011-08-12 18:18:03

iPhone開發(fā)UIPageContr按鈕
點贊
收藏

51CTO技術棧公眾號