MKMapView的圆角

时间:2009-08-29 12:43:02

标签: iphone uitableview

我正在构建一个自定义UITableView,其中每个单元格都包含一段文本和一个MKMapView。我希望单元格中的地图“图标”视图有圆角,这似乎是一个问题。

我正在为我的UITableViewCell和我添加到UITableViewCell的MapIcon(自定义地图视图)使用自定义绘图。

MapIconMKMapView的子类,绘图方法如下所示:

  

- (void)drawRect:(CGRect)rect {

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, strokeWidth);
CGContextSetStrokeColorWithColor(context,self.strokeColor.CGColor);
CGContextSetFillColorWithColor(context, self.rectColor.CGColor);

CGFloat radius = arcRadius;

CGFloat Xmin = CGRectGetMinX(rect);
CGFloat Xmid = CGRectGetMidX(rect);
CGFloat Xmax = CGRectGetMaxX(rect);

CGFloat Ymin = CGRectGetMinY(rect);
CGFloat Ymid = CGRectGetMidY(rect);
CGFloat Ymax = CGRectGetMaxY(rect);   
     

CGContextBeginPath(上下文);       CGContextMoveToPoint(context,Xmin,Ymid);       CGContextAddArcToPoint(context,Xmin,Ymin,Xmid,Ymin,radius);       CGContextAddArcToPoint(context,Xmax,Ymin,Xmax,Ymid,radius);       CGContextAddArcToPoint(上下文,Xmax,Ymax,Xmid,Ymax,radius);       CGContextAddArcToPoint(context,Xmin,Ymax,Xmin,Ymid,radius);       CGContextClosePath(上下文);

CGContextDrawPath(context, kCGPathFillStroke);
     

CGContextClip(上下文);     CGContextEndTransparencyLayer(上下文);   }

地图不会让角落变得粗糙,如下面的屏幕截图所示:

alt text http://img190.imageshack.us/img190/948/picture1vmk.png

但是,如果我从UIView将MapIcon更改为子类并使用相同的自定义绘图方法,则视图会被完美剪切,如下图所示:

alt text http://img503.imageshack.us/img503/6269/picture2xkq.png

以这种方式将MKMapView子类化并期望它剪辑是不对的? 这些角落还有其他任何一个吗?

干杯, 卡斯帕

4 个答案:

答案 0 :(得分:40)

制作圆角的最简单方法:

#import <QuartzCore/QuartzCore.h>
myMapView.layer.cornerRadius = 10.0;

答案 1 :(得分:3)

只是一个小小的修正因为导入语句在digdog的回答中拼写错误。

应该是

#import <QuartzCore/QuartzCore.h>
myMapView.layer.cornerRadius = 10.0;

答案 2 :(得分:1)

查看MKMapView class reference中的概述部分的最后一段:

  

虽然你不应该将MKMapView类本身子类化,但是......

我认为很好地回答了你是否应该将其子类化的问题。你可以做的一件事是在MKMapView的顶部放置另一个视图,它看起来像是圆角的背景。如果您需要它是任意大小,可以在strechableImage上尝试UIImage方法。

答案 3 :(得分:0)

如果需要,可以很容易地围绕特定角落。例如,当地图位于分组 NSTableView

内的 NSTableViewCell 顶部时

ACEToolKit略微修改:

#import <QuartzCore/QuartzCore.h>
- (void)awakeFromNib {
CGRect rect = self.bounds;
float radius = 10.f;

// Create the path
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect
                                               byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight
                                                     cornerRadii:CGSizeMake(radius, radius)];

// Create the shape layer and set its path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = rect;
maskLayer.path = maskPath.CGPath;

// Set the newly created shape layer as the mask for the view's layer
self.mapView.layer.mask = maskLayer;
}