详解iPhone SDK开发基础之自定义仪表控件

移动开发 iOS
控件使用两个UIView来实现仪表控件,并通过CGAffineTransform类来实现仪表指针的旋转,控件在UIDialView类中实现,来看本文如何定义UIDialView类的。

iPhone SDK开发基础之自定义仪表控件是本文要介绍的内容,主要是来学习仪表控件。在iOS开发中,因为程序的需要,有时要自行绘制iPhone SDK没有提供的界面控件,通常使用QuartzCore.framework即可画出你所需要的各种图形,在这里我们实现一个圆形的“仪表盘”控件,控件的外观如图3-48所示,用户可以通过旋转仪表控件的指针来设置程序需要的各种系统参数,如图所示:

详解iPhone SDK开发基础之自定义仪表控件

控件使用两个UIView来实现仪表控件,并通过CGAffineTransform类来实现仪表指针的旋转,控件在UIDialView类中实现,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类的实现文件中,通过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点的位置,并根据此位置使用atan2()函数计算出控件的初始化角度,代码如下。

  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属性实现仪表控件指针伴随用户手指的旋转而旋转,代码如下。

  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.  }  

客户通过实现UIDialViewDelegate接口协议的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开发基础之自定义仪表控件的内容介绍完了,希望通过本文的的学习能对你有所帮助!

责任编辑:zhaolei 来源: 博客园
相关推荐

2009-08-06 09:18:01

ASP.NET自定义控ASP.NET控件开发

2009-08-06 17:52:45

ASP.NET控件开发自定义控件

2009-06-08 20:13:36

Eclipse自定义控

2011-08-02 11:17:13

iOS开发 View

2011-04-19 10:33:16

ASP.NET自定义控

2009-08-07 11:12:58

ASP.NET控件开发

2011-07-18 14:39:53

iPhone SDK UIKit

2011-07-05 18:51:51

QT 控件 鼠标

2015-02-11 17:49:35

Android源码自定义控件

2013-05-20 17:33:44

Android游戏开发自定义View

2021-08-25 10:14:51

鸿蒙HarmonyOS应用

2021-08-16 14:45:38

鸿蒙HarmonyOS应用

2011-08-18 09:52:13

iPhone SDKUIPageContr

2011-08-18 10:02:47

iPhone SDKOpenFlow

2011-08-11 11:51:07

iPhone键盘

2009-07-28 09:32:41

ASP.NET自定义控

2013-04-19 10:14:24

2021-09-06 14:58:23

鸿蒙HarmonyOS应用

2009-07-31 10:23:09

ASP.NET源码DateTimePic

2011-08-12 18:18:03

iPhone开发UIPageContr按钮
点赞
收藏

51CTO技术栈公众号