UIView 绘画
来源:互联网 发布:淘宝活体小动物 编辑:程序博客网 时间:2024/06/11 00:41
最近的一个项目是与画画相关的 在这里简单总结下UIView的绘画方面的东西吧
首先必须写的方法肯定是drawRect,但是我们在代码中并不会直接去调用这个方法,因为这个方法是UIView在重绘的时候,自己调用的.
我们可以在代码中通过调用 setNeedsDisplayInRect 来强制View刷新.
下面说一下怎么在View上面画线,首先是要在响应用户在屏幕上滑动过程的三个方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; previousPoint1 = [touch locationInView:self]; previousPoint2 = [touch locationInView:self]; currentPoint = [touch locationInView:self]; //NSLog(@"pre %f %f",currentPoint.x,currentPoint.y); [bufferArray removeAllObjects]; [self touchesMoved:touches withEvent:event];}-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; previousPoint2 = previousPoint1; previousPoint1 = currentPoint; currentPoint = [touch locationInView:self]; if(drawStep == REDO || drawStep == UNDO) { if(isDraw) drawStep = DRAW; else drawStep = ERASE; } [self calculateMinImageArea:previousPoint1 :previousPoint2 :currentPoint]; }-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ UIGraphicsBeginImageContext(self.bounds.size); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; curImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSDictionary *lineInfo = [NSDictionary dictionaryWithObjectsAndKeys:curImage, @"IMAGE", nil]; if(lineArray.count == 20) { [lineArray removeObjectAtIndex:0]; } [lineArray addObject:lineInfo];}- (void) calculateMinImageArea:(CGPoint)pp1 :(CGPoint)pp2 :(CGPoint)cp{ // calculate mid point CGPoint mid1 = midPoint(pp1, pp2); CGPoint mid2 = midPoint(cp, pp1); CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path, NULL, mid1.x, mid1.y); CGPathAddQuadCurveToPoint(path, NULL, pp1.x, pp1.y, mid2.x, mid2.y); CGRect bounds = CGPathGetBoundingBox(path); CGPathRelease(path); CGRect drawBox = bounds; //Pad our values so the bounding box respects our line width drawBox.origin.x -= self.lineWidth * 1; drawBox.origin.y -= self.lineWidth * 1; drawBox.size.width += self.lineWidth * 2; drawBox.size.height += self.lineWidth * 2; UIGraphicsBeginImageContext(drawBox.size); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; curImage = UIGraphicsGetImageFromCurrentImageContext(); //[curImage retain]; UIGraphicsEndImageContext(); [self setNeedsDisplayInRect:drawBox]; //http://stackoverflow.com/a/4766028/489594 [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];}
- (void)drawRect:(CGRect)rect{ switch (drawStep) { case DRAW: { [curImage drawAtPoint:CGPointMake(0, 0)]; CGPoint mid1 = midPoint(previousPoint1, previousPoint2); CGPoint mid2 = midPoint(currentPoint, previousPoint1); CGContextRef context = UIGraphicsGetCurrentContext(); [self.layer renderInContext:context]; CGContextMoveToPoint(context, mid1.x, mid1.y); CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y); if(previousPoint1.x == previousPoint2.x && previousPoint1.y == previousPoint2.y && previousPoint1.x == currentPoint.x && previousPoint1.y == currentPoint.y) { CGContextSetLineCap(context, kCGLineCapRound); } else { CGContextSetLineCap(context, kCGLineCapRound); } CGContextSetLineWidth(context, self.lineWidth); CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor); CGContextSetAlpha(context, self.lineAlpha); CGContextStrokePath(context); [super drawRect:rect]; //[curImage release]; break; }}
上面就是画线的代码片段 最基本的步骤就是 在move的时候 需要创建CGMutablePathRef 来保存移动的路径 并且调用下面这段代码来将当前的画面保存在curImg变量中,但是这个时候还看不到,因为View并没有刷新 在调用了 setNeedsDisplay之后 需要对curImg进行绘制 让用户看到刷新后的View
UIGraphicsBeginImageContext(drawBox.size); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; curImage = UIGraphicsGetImageFromCurrentImageContext(); //[curImage retain]; UIGraphicsEndImageContext();
上面这段代码 可以看作是截图功能,在很多地方都可以用
好困 暂时没兴趣写了
- UIView 绘画
- uiview的绘画
- IOS学习 动画和绘画:UIView基础动画
- 绘画
- 绘画
- 绘画
- UIView
- UIView
- UIView
- UIView
- UIView
- UIView
- UIView
- UIView
- UIView
- UIView
- UIView
- UIView
- 我也设计模式——4.Builder
- Nmap源码分析(脚本引擎)
- 大型高并发高负载网站的系统架构
- dojox.grid.DataGrid 编程篇(1) -- Layout设计
- 树形结构的处理——组合模式(三)
- UIView 绘画
- phpmyadmin中乱码很通俗的解释和解决方法
- Java调用SQL存储过程详解.
- 树形结构的处理——组合模式(四)
- 【java】Java开源建站工具
- CloseHandle疑惑
- C++简单程序典型案例
- 序列化与反序列化概述
- 主备切换和心跳机制的一点考虑