3

我有一个在矩形中绘制 NSAttributedString 的方法:

-(void)drawInRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge  CFAttributedStringRef)self);

    // left column form
    CGMutablePathRef leftColumnPath = CGPathCreateMutable();
    CGPathAddRect(leftColumnPath, NULL, CGRectMake(rect.origin.x, -rect.origin.y, rect.size.width, rect.size.height));

    // left column frame
    CGFloat translateAmount = rect.size.height;
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, translateAmount);
    CGContextScaleCTM(context, 1.0, -1.0);
    CTFrameRef leftFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), leftColumnPath, NULL);

    CTFrameDraw(leftFrame, context);

    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, translateAmount);
    CGContextScaleCTM(context, 1.0, -1.0);

    CFRelease(leftFrame);
    CFRelease(framesetter);
    CGPathRelease(leftColumnPath);
}

几个月前,我在教程的帮助下把它放在一起。事实证明,默认情况下,这会绘制左对齐的字符串。我对核心文本不太狡猾,有谁知道我如何用文本对齐中心来绘制这个?

(请不要推荐外部的标签绘图类,我需要使用 Core Text 来做)。

4

2 回答 2

3

将 的 设置CTTextAlignmentCTParagraphStylekCTCenterTextAlignment居中的属性字符串的范围。

然后创建CTFramesetter,然后绘制。


示例:http ://foobarpig.com/iphone/coretext-set-text-font-and-alignment-to-cfattributedstring.html

于 2012-11-11T01:06:01.517 回答
1

对于 Swift 3.0:

final private func drawIn(rect: CGRect, attribString: NSAttributedString ){

        guard let context = UIGraphicsGetCurrentContext() else{
            return
        }

        let framesetter = CTFramesetterCreateWithAttributedString(attribString)

        // left column form
        let leftColumnPath = CGMutablePath()
        leftColumnPath.addRect(CGRect(x:rect.origin.x,
                                      y: -rect.origin.y,
                                      width: rect.size.width,
                                      height: rect.size.height)
        )

        // left column frame
        let translateAmount = rect.size.height

        context.saveGState()
        context.textMatrix = CGAffineTransform.identity

        context.translateBy(x: 0, y: translateAmount)
        context.scaleBy(x: 1.0, y: -1.0)
        let leftFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), leftColumnPath, nil)

        CTFrameDraw(leftFrame, context)

        context.textMatrix = CGAffineTransform.identity
        context.translateBy(x: 0, y: translateAmount)
        context.scaleBy(x: 1.0, y: -1.0)
    }


    final private func drawStopMessage(){

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


        let attributes = [NSParagraphStyleAttributeName :  paragraphStyle,
                          NSFontAttributeName :   UIFont.systemFont(ofSize: 24.0),
                          NSForegroundColorAttributeName : UIColor.blue,
                          ]

        let attrString = NSAttributedString(string: "Stop\nall Dance",
                                       attributes: attributes)


        let rect = CGRect(x: 20, y: 100, width: 300, height: 300)
        drawIn(rect: rect, attribString: attrString)
    }
于 2017-05-27T09:56:48.130 回答