在 drawRect MKPolygonRenderer 中写入文本

Posted

技术标签:

【中文标题】在 drawRect MKPolygonRenderer 中写入文本【英文标题】:write text in drawRect MKPolygonRenderer 【发布时间】:2016-02-18 21:35:34 【问题描述】:

好吧,我已经束手无策了。我是 MapKit 的新手,正在编写一个健康统计应用程序,该应用程序在 MKMapView 上绘制与患者居住地相关的数据。我可以删除注释,并毫无问题地绘制邮政编码区域的多边形。

但是我想在地图多边形上写文字(而不是注释)。

这是我的代码,我将 MKPolygonRender 子类化以访问 drawRect。

多边形是完美的,但没有文字。我已经尝试写入多边形中的第一个点(我最终会找到中心)

被困了几个晚上真的很感激。

类多边形渲染:MKPolygonRenderer 变量点:CGPoint!

override init(overlay: MKOverlay) 
    super.init(overlay: overlay)


override func drawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale, inContext context: CGContext) 


    super.drawMapRect(mapRect, zoomScale: zoomScale, inContext: context)
    let mapRect:MKMapRect = self.overlay.boundingMapRect
    let rect:CGRect = self.rectForMapRect(mapRect)
    UIGraphicsPushContext(context)
    var bPath = UIBezierPath()
    //let polygon:MKPolygon = self.polygon
    super.fillColor = UIColor.yellowColor()
    let points = self.polygon.points()
    let pointCount = self.polygon.pointCount

    var point:CGPoint = self.pointForMapPoint(points[0])
    bPath.moveToPoint(point)

    for var i = 1; i < pointCount; i++ 
        point = self.pointForMapPoint(points[i])
        bPath.addLineToPoint(point)

    
    bPath.closePath()
    bPath.addClip()

    let roadWidth:CGFloat = MKRoadWidthAtZoomScale(zoomScale)

    let attributes: [String: AnyObject] = [
        NSForegroundColorAttributeName : UIColor.blackColor(),
        NSFontAttributeName : UIFont.systemFontOfSize(5 * roadWidth)]


    let centerPoint = pointForMapPoint(points[0])
    print(centerPoint)
    let string:NSString = "Hello world"
    string.drawAtPoint(centerPoint, withAttributes: attributes)




    UIGraphicsPopContext()

【问题讨论】:

【参考方案1】:

一般来说你做对了,但我认为字体太小,看不到文字。

尝试将字体大小设置为 100 或更大的值以找出文本是否存在,但您需要放大。

例子:

public override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) 

    let rect:CGRect = self.rect(for: mapRect)

    UIGraphicsPushContext(context);

    // ...

    UIGraphicsPushContext(context);
    UIColor.black.setStroke()
    context.setLineWidth(1)
    context.stroke(rect.insetBy(dx: 0.5, dy: 0.5))

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = .center

    let attributes = [NSAttributedStringKey.paragraphStyle  : paragraphStyle,
                      NSAttributedStringKey.font            : UIFont.systemFont(ofSize: 100.0),
                      NSAttributedStringKey.foregroundColor : UIColor.black]
    "\(rect.size)".draw(in: rect, withAttributes: attributes)
    UIGraphicsPopContext();

下图显示了当矩形大小为 1024x1024 时,如何在地图上显示字体大小为 100 的文本

【讨论】:

以上是关于在 drawRect MKPolygonRenderer 中写入文本的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 中覆盖 drawRect 时的黑色背景

在 iOS 上,setNeedsDisplay 真的不会导致 drawRect 被调用...除非 CALayer 的 display 或 drawInContext 最终调用 drawRect?

iOS重绘机制drawRect

无法在 UITableViewCell 的 drawRect 中绘制

对于drawRect使用,谨慎使用!

UIView 在后台调用 drawRect