MKMapView 的圆角
Posted
技术标签:
【中文标题】MKMapView 的圆角【英文标题】:Rounded corners of MKMapView 【发布时间】:2009-08-29 12:43:01 【问题描述】:我正在构建一个自定义 UITableView,其中每个单元格都包含一段文本和一个 MKMapView。我希望单元格中的地图“图标”视图具有圆角,这似乎是一个问题。
我正在为我的 UITableViewCell 和我添加到我的 UITableViewCell 的 MapIcon
(自定义地图视图)使用自定义绘图。
MapIcon
是MKMapView
的子类,绘制方法如下:
-(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 的圆角的主要内容,如果未能解决你的问题,请参考以下文章