地图的自定义注释视图
我试图为地图绘制注解,我的视图是MKAnnotationView的子类
我需要一个如下所示的形状
我得到的是这样的:
这是我正在使用的代码:
- (void)drawRect:(CGRect)rect { CGContextRef ctx= UIGraphicsGetCurrentContext(); UIGraphicsPushContext(ctx); CGRect bounds = [self bounds]; CGPoint topLeft = CGPointMake(CGRectGetMinX(rect), CGRectGetMinY(rect)); CGPoint topRight = CGPointMake(CGRectGetMaxX(rect), CGRectGetMinY(rect)); CGPoint midBottom = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); CGFloat height = bounds.size.height; CGFloat width = bounds.size.width; //draw semi circle CGContextBeginPath(ctx); CGContextAddArc(ctx, width/2, height/2, width/2, 0 ,M_PI, YES); //draw bottom cone CGContextAddLineToPoint(ctx, midBottom.x, midBottom.y); CGContextAddLineToPoint(ctx, topRight.x, topRight.y + height/2); // mid right CGContextClosePath(ctx); CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor); CGContextFillPath(ctx); UIGraphicsPopContext(); }
如果用四条曲线替换线条,可以达到所需的效果:
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx= UIGraphicsGetCurrentContext();
UIGraphicsPushContext(ctx);
CGRect bounds = [self bounds];
CGPoint topLeft = CGPointMake(CGRectGetMinX(rect), CGRectGetMinY(rect));
CGPoint topRight = CGPointMake(CGRectGetMaxX(rect), CGRectGetMinY(rect));
CGPoint midBottom = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));
CGFloat height = bounds.size.height;
CGFloat width = bounds.size.width;
//draw semi circle
CGContextBeginPath(ctx);
CGContextAddArc(ctx, width/2, height/2, width/2, 0 ,M_PI, YES);
//draw bottom cone
CGContextAddQuadCurveToPoint(ctx, topLeft.x, height * 2 / 3, midBottom.x, midBottom.y);
CGContextAddQuadCurveToPoint(ctx, topRight.x, height * 2 / 3, topRight.x, topRight.y + height/2);
// CGContextAddLineToPoint(ctx, midBottom.x, midBottom.y);
// CGContextAddLineToPoint(ctx, topRight.x, topRight.y + height/2); // mid right
CGContextClosePath(ctx);
CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);
CGContextFillPath(ctx);
UIGraphicsPopContext();
}
这采用二次贝塞尔曲线,当你不想要拐点时,这是一条很好的曲线。 你可以用立方贝塞尔实现类似的曲线,但是如果你不小心控制点,你可能会得到不希望的拐点。 每条曲线只有一个控制点,二次曲线更容易一些。
通过选择x
值与半圆的起点和终点相同的控制点,它可以确保从圆到平滑过渡到该点的曲线。 通过为那些相对接近半圆的起点和终点的控制点选择y
值,可以确保曲线从半圆到点快速过渡。 你可以调整这些控制点,但希望这可以说明这个想法。
为了说明这两种曲线之间的区别,请参见“Quartz 2D编程指南”的“路径”一章的“曲线”部分。
链接地址: http://www.djcxy.com/p/74269.html