我正在构建一个自定义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(上下文,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子类化并期望它剪辑是不对的? 这些角落还有其他任何一个吗?
干杯, 卡斯帕
答案 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;
}