MKMapView 的圆角

Posted

技术标签:

【中文标题】MKMapView 的圆角【英文标题】:Rounded corners of MKMapView 【发布时间】:2009-08-29 12:43:01 【问题描述】:

我正在构建一个自定义 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(context, Xmax, Ymax, Xmid, Ymax, 半径); CGContextAddArcToPoint(context, Xmin, Ymax, Xmin, Ymid, radius); CGContextClosePath(上下文);

CGContextDrawPath(context, kCGPathFillStroke);

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

而且地图没有拐弯,如下图所示:

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

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

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

以这种方式子类化 MKMapView 并期望它被剪辑对我来说是错误的吗? 任何其他的圆角这些角落?

干杯, 卡斯帕

【问题讨论】:

你有没有发现将mapview放在这里退出并重新进入view时会崩溃? 【参考方案1】:

制作圆角的最简单方法:

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

【讨论】:

像魅力一样工作,谢谢!我猜是时候坐下来阅读更多关于 CA 的内容了。 它的cornerRadius,而不是cornerRadious【参考方案2】:

只是一个小的更正,因为 digdog 的答案中的 import 语句拼写错误。

应该是

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

【讨论】:

【参考方案3】:

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

虽然你不应该继承 MKMapView 类本身,...

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

【讨论】:

该子类注释是在获取有关地图行为的信息的上下文中编写的。我应该能够将其子类化以维护 UIView(就像 digdog 所描述的那样)【参考方案4】:

如果需要,也可以很容易地绕过特定的角落。例如,当地图位于分组 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;

【讨论】:

以上是关于MKMapView 的圆角的主要内容,如果未能解决你的问题,请参考以下文章

MKMapView 和响应者链

在 MKMapView 中释放缓存

MKMapView 重置回世界视图:重新烘焙

加载 MKMapView 时崩溃

没有锚的popover segue,MKMapView

MKMapView 不更新用户位置图像