我有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 – 如何在梯形(或圆形)中绘制文本?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)