1.绘制箭头的三种方式
// Drawing code // CGContextRef con = UIGraphicsGetCurrentContext(); // //draw a black(by default) vertical line,the shaft of the arrow 箭杆 // CGContextMoveToPoint(con, 100, 100); // CGContextAddLineToPoint(con, 100, 19); // CGContextSetLineWidth(con, 20); // CGContextStrokePath(con); // //draw a red triangle,the point of the arrow // CGContextSetFillColorWithColor(con, [[UIColor redColor] CGColor]); // CGContextMoveToPoint(con, 80, 25); // CGContextAddLineToPoint(con, 100, 0); // CGContextAddLineToPoint(con, 120, 25); // CGContextFillPath(con); // //snip a triangle out of the shaft by drawing in clear blend mode // CGContextMoveToPoint(con, 90, 100); // CGContextMoveToPoint(con, 100, 90); // CGContextMoveToPoint(con, 110, 100); // CGContextSetBlendMode(con, kCGBlendModeClear); // CGContextSetAlpha(con, 1.0); // CGContextFillPath(con); //当需要获取CGPath时,可以使用UIBezierPath // UIBezierPath *p = [UIBezierPath bezierPath]; // // [p moveToPoint:CGPointMake(100, 100)]; // [p addLineToPoint:CGPointMake(100, 19)]; // [p setLineWidth:20]; // [p stroke]; // [[UIColor redColor] set]; // [p removeAllPoints]; // [p moveToPoint:CGPointMake(80, 25)]; // [p addLineToPoint:CGPointMake(100, 0)]; // [p addLineToPoint:CGPointMake(120, 25)]; // [p fill]; // // [p removeAllPoints]; // [p moveToPoint:CGPointMake(90, 101)]; // [p addLineToPoint:CGPointMake(100, 90)]; // [p addLineToPoint:CGPointMake(110, 101)]; // [p fillWithBlendMode:kCGBlendModeClear alpha:1.0]; //Clipping CGContextRef con = UIGraphicsGetCurrentContext(); //punch triangular hole in context clipping region CGContextMoveToPoint(con, 90, 100); CGContextAddLineToPoint(con, 100, 90); CGContextAddLineToPoint(con, 110, 100); CGContextClosePath(con); CGContextAddRect(con, CGContextGetClipBoundingBox(con)); CGContextEOClip(con); //draw the vertical line CGContextMoveToPoint(con, 100, 100); CGContextAddLineToPoint(con, 100, 19); CGContextSetLineWidth(con, 20); CGContextStrokePath(con); //draw the red triangle.the point of the arrow CGContextSetFillColorWithColor(con, [[UIColor redColor] CGColor]); CGContextMoveToPoint(con, 80, 25); CGContextAddLineToPoint(con, 100, 0); CGContextAddLineToPoint(con, 120, 25); CGContextFillPath(con);效果:
CGContextRef con = UIGraphicsGetCurrentContext(); [[self arrowImage] drawAtPoint:CGPointMake(0, 0)]; for (int i=0; i<3; i++) { CGContextTranslateCTM(con, 20, 100); CGContextRotateCTM(con, 30*M_PI/180); CGContextTranslateCTM(con, -20, -100); [[self arrowImage] drawAtPoint:CGPointMake(0, 0)]; } // } -(UIImage *)arrowImage { UIGraphicsBeginImageContextWithOptions(CGSizeMake(40, 100), NO, 0.0); CGContextRef con = UIGraphicsGetCurrentContext(); //punch triangular hole in context clipping region CGContextMoveToPoint(con, 10, 100); CGContextAddLineToPoint(con, 20, 90); CGContextAddLineToPoint(con, 30, 100); CGContextClosePath(con); CGContextAddRect(con, CGContextGetClipBoundingBox(con)); CGContextEOClip(con); //draw the vertical line CGContextMoveToPoint(con, 20, 100); CGContextAddLineToPoint(con, 20, 19); CGContextSetLineWidth(con, 20); CGContextStrokePath(con); //draw the red triangle.the point of the arrow CGContextSetFillColorWithColor(con, [[UIColor redColor] CGColor]); CGContextMoveToPoint(con, 0, 25); CGContextAddLineToPoint(con, 20, 0); CGContextAddLineToPoint(con, 40, 25); CGContextFillPath(con); UIImage *im = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return im; }
当我不是绘制在(0,0)时就有问题,好像是由坐标系统改变导致的
CGContextRef con = UIGraphicsGetCurrentContext(); [[self arrowImage] drawAtPoint:CGPointMake(150, 200)]; for (int i=0; i<12; i++) { CGContextTranslateCTM(con, 20, 100); CGContextRotateCTM(con, 30*M_PI/180); CGContextTranslateCTM(con, -20, -100); [[self arrowImage] drawAtPoint:CGPointMake(150, 200)]; }
尚未找到原因,有知道的童鞋,欢迎告知,一起交流