Как правильно компенсировать систему координат CGContextRef, чтобы начало координат находилось в верхнем левом углу - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь нарисовать текст, используя CoreText. У меня есть следующий код:

CGContextRef uiContext = UIGraphicsGetCurrentContext();

NSMutableDictionary<NSAttributedStringKey,id> *attributes = [NSMutableDictionary<NSAttributedStringKey,id> new];
[attributes setObject:UIColor.redColor forKey:NSForegroundColorAttributeName];
[attributes setObject:[UIFont systemFontOfSize:40] forKey:NSFontAttributeName];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:@"Str" attributes:attributes];

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, nil, CGRectMake(0, 50, attrString.size.width, attrString.size.height));
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrString);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attrString.length), path, nil);

CTFrameDraw(frame, uiContext);

С помощью приведенного выше кода текст размещается правильно, но зеркально отражается в направлении y proper origin, wrong text orientation

Итак, я попытался применить преобразование и масштабирование, что помогло с текстом, но теперь он расположен в левом нижнем углу, что не является желаемым поведением.

CGContextSetTextMatrix(uiContext, CGAffineTransformIdentity);
CGContextTranslateCTM(uiContext, 0.0, self.bounds.size.height);
CGContextScaleCTM(uiContext, 1.0, -1.0);

wrong origin, proper orientation

Есть какие-нибудь идеи, что мне здесь не хватает? Спасибо.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Откуда берется это значение 50 для источника y в этой строке?

CGPathAddRect(path, nil, CGRectMake(0, 50, attrString.size.width, attrString.size.height));

Если вы начинаете с нижней левой координаты y, то значение 50 запустит начертание траектории у начала координат 50 от этого.

Вы должны иметь возможность отрегулировать начало координат у смещения от вершины, используя высоту представления контейнера (в которое вы хотите нарисовать текст) минус attrString.size.height.

Вот пример того, как это может выглядеть, если вы рисуете подкласс пользовательского представления 'drawRect:rect:

CGPathAddRect(path, nil, CGRectMake(0, rect.size.height - attrString.size.height, attrString.size.width, attrString.size.height));

Что приведет к этому:

CoreTextDrawing upper left hand corner of container view

0 голосов
/ 23 апреля 2019

Как насчет этого:

быстрое:

   CGContextSetTextMatrix(uiContext, CGAffineTransform(a: 1.0, b: 0.0, c: 0.0, d: -1.0, tx: 0.0, ty: 0.0))

Цель c:

    CGContextSetTextMatrix(uiContext, CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0));

Для простой настройки сделайте следующее:

   CGPathAddRect(path,nil, CGRectMake(0, 0, attrString.size.width, 1.5 * attrString.size.height));

вместо:

     CGPathAddRect(path, nil, CGRectMake(0, 50, attrString.size.width, attrString.size.height));
...