【学习ios之路:UI系列】绘图(drawRect)

实现代码如下:

①在自定义视图中定义3个属性

//记录线条的路径
@property (nonatomic, retain) NSMutableArray *paths;
//设置绘图过程中线条的颜色
@property (nonatomic, retain) UIColor *pathColor;
@property (nonatomic, assign) CGFloat pathWidth;
//撤销功能
- (void)undo;
//清除功能
- (void)clear;

②实现效果,需要在手指开始移动即移动过程中处理操作,即需要在下面两个方法中操作.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;


方法中实现:

//实现相应时间
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //获取手指对象
    UITouch *touch =  [touches anyObject];
    //获取手指当前触摸点
    CGPoint startPoint = [touch locationInView:touch.view];
    //创建路径对象
    UIBezierPath *path = [UIBezierPath bezierPath];
    //设置路径的起始点
    [path moveToPoint:startPoint];
    //配置路径属性
    //线条宽度
    path.lineWidth = self.pathWidth;
   //线条结合处样式
    path.lineJoinStyle = kCGLineJoinRound;
    //线条样式
    path.lineCapStyle = kCGLineCapRound;
    //将路径添加到路径数组中
    [self.paths addObject:path];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    //获取手指对象
    UITouch *touch = [touches anyObject];
    //获取手指当前触摸的位置
    CGPoint currentPoint = [touch locationInView:touch.view];
    //获得当前路径
    UIBezierPath *path = [self.paths lastObject];
    //设置路径终点
    [path addLineToPoint:currentPoint];
    //该方法无需实现,只是通过它自动调用drawRect方法
    [self setNeedsDisplay];
}


③实现视图中自带方法(drawRect),代码如下:

- (void)drawRect:(CGRect)rect {
     [self.pathColor setStroke];
    //遍历所有路径
    for (UIBezierPath *path in self.paths) {
    path.usesEvenOddFillRule = YES;
        [self.pathColor setFill];
        //设置笔画的颜色
        [self.pathColor setStroke];
        //和所有的路径相连
       [path stroke];
    }
}

④属性实现懒加载 即实现消除 和撤销操作

- (NSMutableArray *)paths {
    if (!_paths) {
        self.paths = [NSMutableArray arrayWithCapacity:1];
    }
    return [[_paths retain] autorelease];
}
- (CGFloat)pathWidth {
    if (!_pathWidth) {
        _pathWidth = 1;
    }
    return _pathWidth;
}
//撤销功能
- (void)undo {
    //删除最后一条数据,路径
    [self.paths removeLastObject];
    [self setNeedsDisplay];
}
//清除功能
- (void)clear {
     //删除所有信息
    [self.paths removeAllObjects];
    [self setNeedsDisplay];
}

④实现将涂鸦图片保存到系统相册.

1)获取涂鸦图片(UIImage的分类方法),view即当前涂鸦的视图

  + (UIImage *)saveImageFromDrawView:(UIView *)view {
    //获取图形上下文(上下文在这两个Graphics之间有效或者在DracRect中有效)
    UIGraphicsBeginImageContext(view.frame.size);
    //2.将要保存的view的layer绘制到bitmap图形上下文中,完成拍照的功能
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    //从当前上下文获取图片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    //结束操作
    UIGraphicsEndImageContext();
    return image;

2)将图片保存(写在button的触发事件中)

   //获取要保存的图片
    UIImage *image = [UIImage saveImageFromDrawView:self.nameView];
    //保存到相册
    UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);

⑤滑动最下方的滑竿实现改变线条颜色,即线条的宽度.

//设置颜色
- (IBAction)colorAction:(UISlider *)sender {
    //CGFloat value = sender.value;
    self.nameView.pathColor = [UIColor colorWithHue:sender.value saturation:sender.value brightness:sender.value alpha:sender.value];

}
//设置线条的宽度
- (IBAction)boldAction:(UISlider *)sender {
    self.nameView.pathWidth = sender.value;
}
时间: 2024-12-21 05:34:38

【学习ios之路:UI系列】绘图(drawRect)的相关文章

【学习ios之路:UI系列】iOS沙盒机制,文件读取,归档与反归档

1.IOS中的沙盒机制 IOS中的沙盒机制是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件等. 特点: 1.每个应用程序都在自己的沙盒内 2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容 3.应用程序向外请求或接收数据都需要经过权限认证 每个沙盒含有3个文件夹:Documents, Library 和 tmp.Library包含Caches.Preferences目录.如下图

【学习ios之路:UI系列】UIProgressView

实现类似读取数据进度条效果 代码如下: ①创建UIProgressView对象 1)定义属性 { NSTimer *_proTimer;//计时 } @property (nonatomic, retain) UIProgressView *proView; //显示进度信息 @property (nonatomic, retain) UILabel *proLabel; @property (nonatomic, assign) float proValue;//保存进度值 //创建控件UIP

【学习ios之路:UI系列】点击更换头像实现从相册读取照片和拍照两种功能

功能如下: 1.点击头像,提示选择更换头像方式①相册 ②照相. 2.点击相册,实现通过读取系统相册,获取图片进行替换. 3.点击照相,通过摄像头照相,进行替换照片. 4.如果摄像头,弹出框警告. 代码如下: 1.通过UIActionSheet对象实现提示功能 //创建对象 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: @"提示" delegate:self cancelButtonTitle:@&q

【学习ios之路:UI系列】NSPredicate相关用法

NSPredicate NSPredicate是一个Foundation类,它指定数据被获取或者过滤的方式. 它的查询语言就像SQL的WHERE和正则表达式的交叉一样,提供了具有表现力的,自然语言界面来定义一个集合被搜寻的逻辑条件. NSPredicate的几种用法 ①常见形式 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == 'zhangdan'"]; //注意:如果谓词串中的文本块未被引用,则被看

【学习ios之路:UI系列】实现轮播图效果(UIImageView,UIScrollView,UIPageControl,NSTimer相结合)

实现效果,在不点击的情况下,自定滚动,点击时,停止.如下图 部分代码如下: //调用NSTimer方法,自定计时 - (void)autoScroll { self.timer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self  selector:@selector(scrollToRight) userInfo:nil repeats:YES]; } //实现触发方法 - (void)scrollToRight { [UIVie

【学习ios之路:UI系列】UIAlertView. UIActionSheet 和 UIAlertController

1.UIAlertView ①简单无代理模式,代码如下: UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"这是一个警告" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定",  @"按钮一", @"按钮二", nil

【学习ios之路:UI系列】实现打电话,发短信,发邮件功能

①发短信 1.创建Button ,添加button的响应事件 UIButton *callButton = [UIButton buttonWithType:UIButtonTypeCustom]; callButton.frame = CGRectMake(80, 150, 80, 80); callButton.backgroundColor = [UIColor cyanColor]; [callButton setTitle:@"短信" forState:UIControlSt

【学习ios之路:UI系列】UITabBarController , UIToorBar

1. UITabBarController(标签视图控制器),用来管理具有并列关系的视图控制器,多个界面同时存在. UITableBarController 和UINavigationController 类似, UITabBarController 也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型的例子就是QQ .微信等应?.效果如下图: ①使用UITabBarController步骤如下: (1) 初始化UITabBarController (2) 设置UIWindow的rootV

【学习ios之路:UI系列】ios中常见的几种控件.(UISlider,UISwitch,UIStepper,UISegmentedControl)

一.滑块控件(UISlider)  效果如下 注:系统原来效果如下 具体功能运用: ①创建滑块控件(UISlider),设置控件大小,并添加到window视图上,后释放 UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(20, 30, 280, 100)]; [self.window addSubview:slider];  [slider release]; ②设置最大值,最小值,以及开始时滑动条所在的位置 //设置最大