swift – 如何在梯形(或圆形)中绘制文本?

swift – 如何在梯形(或圆形)中绘制文本?,第1张

概述让我们想象一下我有一些文字:“有些文字是梯形的.” 我有NSAttributedString扩展,它返回带有属性文本的UIImage: extension NSAttributedString { func asImage() -> UIImage? { defer { UIGraphicsEndImageContext() } 让我们想象一下我有一些文字:“有些文字是梯形的.”

我有NSAttributedString扩展,它返回带有属性文本的UIImage:

extension NSAttributedString {    func asImage() -> UIImage? {        defer {            UIGraphicsEndImageContext()        }        let size = boundingRect(with: CGSize.zero,options: [.useslineFragmentOrigin,.truncatesLastVisibleline],context: nil).size        UIGraphicsBeginImageContext(size)        draw(at: CGPoint.zero)        return UIGraphicsGetimageFromCurrentimageContext()    }}

但是这个函数在一行中返回文本,因为使用了boundingRect:

------------------------------------|Some attributed text in trapezoID.|------------------------------------

如果我使用自定义rect来绘制文本,那将无济于事……

UIGraphicsBeginImageContext(CGRect(x: 0,y: 0,wIDth: 100,height: 30))draw(at: CGPoint.zero)

…因为文字将是矩形:

--------------|Some attribu||ted text in ||trapezoID.  |--------------

我需要的是在具有已知角位置(或具有已知半径的圆圈)的梯形中绘制文本.所以每个新的文本行都应该以一点偏移量开始,参见示例:

所以我希望看到类似的东西:

---------------\Some attribut/ \ed text in /  \trapezoID/   ---------

我怎样才能达到这个效果?

解决方法 你必须在这里下载到CoreText级别.好消息是,您将能够以您想要的任何形状绘制文本!

extension NSAttributedString {    public func draw(in path: CGPath) {        let context = UIGraphicsGetCurrentContext()!        let transform = CGAffinetransform(scaleX: +1,y: -1)        let flippedpath = CGMutablePath()        flippedpath.addpath(path,transform: transform)        let range = CFRange(location: 0,length: 0)        let framesetter = CTFramesetterCreateWithAttributedString(self)        let frame = CTFramesetterCreateFrame(framesetter,range,flippedpath,nil)        context.saveGState()        // DeBUG: fill path.        context.setFillcolor(red: 1.0,green: 0.0,blue: 0.0,Alpha: 0.5)        context.beginPath()        context.addpath(path)        context.fillPath()        context.concatenate(transform)        CTFrameDraw(frame,context)        context.restoreGState()    }}

你可以像这样使用它:

let string = NSAttributedString(string: "Lorem ipsum dolor sit amet,consectetur adipiscing elit. Lorem ipsum dolor sit amet,consectetur adipiscing elit.")let bounds = CGRect(x: 0,wIDth: 120,height: 120)let path = CGMutablePath()path.move(to: CGPoint(x: 10,y: 10))path.addline(to: CGPoint(x: 110,y: 10))path.addline(to: CGPoint(x: 90,y: 110))path.addline(to: CGPoint(x: 30,y: 110))path.closeSubpath()UIGraphicsBeginImageContextWithOptions(bounds.integral.size,true,0)defer { UIGraphicsEndImageContext() }let context = UIGraphicsGetCurrentContext()!context.setFillcolor(UIcolor.white.cgcolor)context.fill(.infinite)string.draw(in: path)let image = UIGraphicsGetimageFromCurrentimageContext()!

坏消息是,这个解决方案最后没有给你一个省略号.如果你真的想拥有它,你可能需要对framesetter给你的最后一行做一些调整.

总结

以上是内存溢出为你收集整理的swift – 如何在梯形(或圆形)中绘制文本?全部内容,希望文章能够帮你解决swift – 如何在梯形(或圆形)中绘制文本?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1018454.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存