原地址: iOS 5 View Programming & Drawing
1.创建一个工程,选择Single View Application.命名为Circle.
2 创建一个Object-C文件,选择父类UIView,将其命名为CircleView,保存,然后在CircleView.h中添加属性scale.
3.打开CircleViewController.xib.添加View,并将其类名设置为CircleView.然后在其下方再拖入slider控件.
4.分别选中改view和slider控件,按下control键,拉线至CircleViewController.h ,创建输出口.选中slide控件,按下ctr键,拉线至CircleViewController.h,创建Action.
5.在CircleViewController.h中导入CircleView类.并在其实现类中,完善slide--Action的方法.
6.在CircleView中对绘图做处理.
相关代码如下:
CircleViewController.h
#import <UIKit/UIKit.h>
#import "CircleView.h"
@interface CircleViewController : UIViewController{
CircleView *circle;
UISlider *slider;
}
@property (strong, nonatomic) IBOutlet CircleView *circle;
@property (strong, nonatomic) IBOutlet UISlider *slider;
- (IBAction)slide:(id)sender;
@end
CircleViewController.m
#import "CircleViewController.h"
@interface CircleViewController ()
@end
@implementation CircleViewController
@synthesize circle;
@synthesize slider;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)viewDidUnload
{
[self setCircle:nil];
[self setSlider:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
- (IBAction)slide:(id)sender {
UISlider *s = sender;
self.circle.scale = s.value;
[self.circle setNeedsDisplay];
}
@end
CircleView.h
#import <UIKit/UIKit.h>
@interface CircleView : UIView
@property double scale;
@end
CircleView.m
#import "CircleView.h"
@implementation CircleView
@synthesize scale;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setup];
// Initialization code
}
return self;
}
- (void)awakeFromNib
{
[self setup];
}
- (void)setup
{
self.contentMode = UIViewContentModeRedraw;
}
- (void)drawCircle:(CGPoint)p withRadius:(CGFloat)radius inContext:(CGContextRef)context
{
UIGraphicsPushContext(context);
CGContextBeginPath(context);
CGContextAddArc(context, p.x, p.y, radius, 0, 2*M_PI, YES);
CGContextStrokePath(context);
UIGraphicsPopContext();
}
- (void)drawRect:(CGRect)rect
{
CGPoint point;
point.x = self.bounds.origin.x + self.bounds.size.width/2;
point.y = self.bounds.origin.y + self.bounds.size.height/2;
CGFloat size = self.bounds.size.width / 2;
if (self.bounds.size.height < self.bounds.size.width) size = self.bounds.size.height / 2;
size *= 0.90;
if (self.scale >= 0) size *= self.scale;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 5.0);
[[UIColor redColor] setStroke];
[self drawCircle:point withRadius:size inContext:context];
}
@end
根据slide的value值的大小而改变CircleView的view.
- 当需要重新绘制试图时,ios调用drawRect 重画视图内容.
- drawRect不会被直接调用.
- 当发送 setNeedsDisplay 消息时,drawRect方法就被调用.