背景:我正在使用Core Graphics绘制UIImageView.我想最终在核心图形绘图上绘制一个文本字符串.
这个(hackingwithswift.com)方法我用来将文本绘制到图像,将我的imageView设置为该图像,然后用核心图形绘制.但我希望文本覆盖核心图形绘图.
现在我已经转到这个/sf/answers/2490192001/,但它仍然不允许我在我的绘图上写.
class MapViewController: UIViewController {
@IBOutlet var imageView: UIImageView!
func drawScale() {
// establish 6 points to draw a little bar with
let length = CGFloat(80.0)
let bottom = imageView.bounds.size.height - 15.0
let left = CGFloat(20.0)
let top = bottom - 20.0
let middle = top + 10.0
let right = left + length
let topLeft = CGPoint(x: left, y: top)
let topRight = CGPoint(x: right, y: top)
let bottomRight = CGPoint(x: …Run Code Online (Sandbox Code Playgroud) 我想在可以占用任何形状的路径中写入文本.现在我可以在其中绘制翻转文本:
NSArray *coordinates = ...;
CGMutablePathRef pathRef = [self objectPathGivenCoordinates:coordinates];
... // Draw the shapes
// Now draw the text
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
NSAttributedString* attString = [[NSAttributedString alloc] initWithString:@"0,1,2..."];
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attString);
CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, [attString length]), pathRef, NULL);
CTFrameDraw(frame, context);
Run Code Online (Sandbox Code Playgroud)
这产生了这个:

我知道iOS有一个翻转坐标系.大多数解决方案在绘制之前添加这两行:
CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
Run Code Online (Sandbox Code Playgroud)
但这产生了这个:

那么为什么这种技术不起作用呢?在我见过的每个例子中,当文本以对称,剪切或OS X呈现时,使用此技术.如果我们以对称形状绘制文本,我们调用CGContextTranslateCTM()并CGContextScaleCTM()有意义.调用CGContextTranslateCTM(context, 0, rect.size.height),将第一个字母的原点移动到顶部.调用CGContextScaleCTM(context, 1, -1)反转Y的方向.如果我们在对称形状上反转Y的方向,它不会改变.可悲的是,我的形状不对称.
这是我考虑过但放弃了
UIImageView以某种方式翻转它(1)CGContextSetTextMatrix()以便从左到右,从下到上绘制文本,并且正面朝上.确定在确定形状的字符串后,形状中剩余多少个额外字符.翻转单词(现在它将从上到下,从右到左,右上方).为每个额外的角色添加空格.现在为每个人CTLine,以某种方式再次反转单词(现在它将从上到下,从左到右,右上方)(2)为什么我放弃了它们
(1)我无法翻转我的图像.他们总是需要正面朝上
(2)对于其他人知道的简单解决方案,这可能是过度的