iPhone SDK开发基础之
自定义仪表控件
在iOS开发中,因为程序的需要,有时要自行绘制iPhone SDK没有提供的界面控件,通常使用QuartzCore.framework即可画出你所需要的各种图形,在这里我们实现一个圆形的“仪表盘”控件,控件的外观如图3-48所示,用户可以通过旋转仪表控件的指针来设置程序需要的各种系统参数。
控件使用两个UIView来实现仪表控件,并通过CGAffineTransform类来实现仪表指针的旋转,控件在UIDialView类中实现,UIDialView类的定义如下。
// UIDialView.h
#import <UIKit/UIKit.h>
@protocol UIDialViewDelegate
@optional
- (void)dialValue:(int)tag Value:(float)value;
@end
@interface UIDialView : UIView {
id<UIDialViewDelegate> delegate;
NSTimer *timer;
UIImageView *iv;
float maxValue,minValue;
CGAffineTransform initialTransform ;
float currentValue;
}
@property(nonatomic,assign)id<UIDialViewDelegate>delegate;
@property CGAffineTransform initialTransform;
@property float currentValue;
@end
在UIDialView类的实现文件中,通过init()方法读取图片文件初始化控件背景和指针,代码如下。
// UIDialView.m
#import "UIDialView.h"
@interface UIDialView()
-(void)spin:(NSTimer *)timer;
-(float) goodDegrees:(float)degrees;
@end
#define degreesToRadians(degrees) (M_PI * degrees / 180.0)
#define radiansToDegrees(radians) (radians * 180 / M_PI)
static CGPoint delta;
static float deltaAngle;
static float currentAngle;
@implementation UIDialView
@synthesize initialTransform,currentValue;
- (void)dealloc {
[iv release];
[super dealloc];
}
@synthesize delegate;
- (id)init{
if ((self = [super init])) {
self.userInteractionEnabled = YES;
iv =[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"knob. png"]];
UIImage *backgroundTile = [UIImage imageNamed: @"clock.png"];
UIColor *backgroundPattern = [[UIColor alloc] initWithPatternImage: backgroundTile];
self.contentMode = UIViewContentModeCenter;
[self setBackgroundColor:backgroundPattern];
[backgroundPattern release];
iv.backgroundColor = [UIColor clearColor];
iv.autoresizesSubviews= YES;
self.frame = CGRectMake(0, 0, iv.frame.size.width, iv.frame.size. height);
[self addSubview:iv];
[self bringSubviewToFront:iv];
[iv release];
currentValue = 0;
currentAngle = 0;
deltaAngle = 0.0;
}
return self;
}
在UIView的touchesBegan()方法中捕获用户Touch点的位置,并根据此位置使用atan2()函数计算出控件的初始化角度,代码如下。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *thisTouch = [touches anyObject];
delta = [thisTouch locationInView:self];
float dx = delta.x - iv.center.x;
float dy = delta.y - iv.center.y;
deltaAngle = atan2(dy,dx);
initialTransform = iv.transform;
}
在用户的旋转过程中通过设置指针UIView对象的transform属性实现仪表控件指针伴随用户手指的旋转而旋转,代码如下。
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint pt = [touch locationInView:self];
float dx = pt.x - iv.center.x;
float dy = pt.y - iv.center.y;
float ang = atan2(dy,dx);
if (deltaAngle == 0.0) {
deltaAngle = ang;
initialTransform = iv.transform;
}else{
float angleDif = deltaAngle - ang;
CGAffineTransform newTrans = CGAffineTransformRotate(initialTransform, -angleDif);
iv.transform = newTrans;
float diffValue = [self goodDegrees:radiansToDegrees(angleDif)];
currentValue = maxValue - ((maxValue - minValue)/300)*diffValue;
if(currentValue > 100) currentValue = 100;
}
if (delegate != nil) {
[delegate dialValue:self.tag Value:currentValue];
}
}
客户通过实现UIDialViewDelegate接口协议的dialValue()方法而得到控件的通知消息,代码如下。
// DialViewController.h
#import <UIKit/UIKit.h>
#import "UIDialView.h"
@interface DialViewController : UIViewController< UIDialViewDelegate> {
UIDialView *dialView;
UILabel *myLabel;
}
- (void)dialValue:(int)tag Value:(float)value{
NSString *str = [NSString stringWithFormat:@"%.1f",v*100];
[myLabel performSelector:@selector(setText:) withObject:str];
}
本节相关的完整Xcode工程源代码文件请参考本书附带的光盘中的DialControl工程。
本文节选自《iOS软件开发揭密:iPhone&iPad企业应用和游戏开发》一书。
《iOS软件开发揭密:iPhone&iPad企业应用和游戏开发》一书已由电子工业出版社正式出版,本书由虞斌著。
购买地址:
互动出版网:http://product.china-pub.com/198191
分享到:
相关推荐
iphone中的基础控件UIButton扩展,自定义UICheckBox, 适合初学者,主要学习自定义UICheckBox的常用属性设置、点击事件、返回所有选中的box索引等
iphone中的基础控件UIButton扩展,自定义UIRadioButton, 适合初学者,主要学习自定义UIRadioButton的常用属性设置、点击事件等
iphone开发技巧UI篇之自定义TabBar iphone开发技巧UI篇之自定义TabBar iphone开发技巧UI篇之自定义TabBar
iPhone SDK编程入门经典,让您轻松入门学习IOS的开发
自定义搜索控件,iOSsearchBar
iphone SDK 下载BT
非常精致的iphone自定义日期控件,可以进行扩展。
《iPhone SDK 3开发指南》循序渐进地讲述了基于 iPhone SDK 的应用程序开发的各个方面,涉及到了《iPhone SDK 3开发指南》循序渐进地讲述了基于 iPhone SDK 的应用程序开发的各个方面,涉及到了从编码到调试到性能...
本书是一部关于iPhone SDK和iPhone开发的基础教程,内容翔实、语言生动。书中结合消费类设备上常见的实例,循序渐进地讲解了iPhone开发的基本流程,并介绍了最先进、时尚、受欢迎的iPhone特性。.(china-pub.com) ...
《iPhone开发基础教程》是一部关于iPhone SDK和iPhone开发的基础教程,内容翔实、语言生动。书中结合消费类设备上常见的实例,循序渐进地讲解了iPhone开发的基本流程,并介绍了最先进、时尚、受欢迎的iPhone 特性。
IPhone sdk旧版下载地址,IPhone sdk旧版下载地址
我们知道,当系统控件并不能满足我们的需求时,我们就需要来创建自定义控件,主要有两种方法 (1)引入布局 下面来自定义一个控件,iPhone的标题栏,创建一个标题栏并不是什么难事,加入两个button一个TextView就行...
仿iphone日期选择自定义控件,可以选择年月日时分秒
iPhone sdk开发 绘图 无断点 画任意轨迹
iphone中的基础控件UIButton, 适合初学者,主要学习UIButton的常用属性设置、方法调用、点击事件等
The book starts with the basics, walking you through the process of downloading and installing Apple's free iPhone SDK, then stepping you though the creation of your first simple iPhone application....
都是可直接运行的源代码,可以为初学者提供帮助
30天精通iPhone手机编程+实例iPhone SDK编程入门教程.rar
《iPhone开发基础教程》是一部关于iPhone SDK和iPhone开发的基础教程,内容翔实、语言生动。书中结合消费类设备上常见的实例,循序渐进地讲解了iPhone开发的基本流程,并介绍了最先进、时尚、受欢迎的iPhone 特性。
iPhone开发使用Xib自定义UITableViewCell