使用Core Text绘制居中的NSAttributedString

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并不太熟悉,有人知道如何使用文本居中对齐来绘制吗?

(请不要推荐使用外部标签绘图类,我需要使用Core Text完成此任务)。

2个回答

3

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)
    }

这段代码在我的设备上将文本倒置,但是在 CTFrameDraw 之前添加 let textTransform = CGAffineTransform(scaleX: 1.0, y: -1.0) context.textMatrix = textTransform 可以解决问题。 - Loren
哎呀...忘了提醒关于UIkit / Cocoa的常规警告了 :( ? - ingconti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接