Эквивалент CGContextSelectFont
В iOS7 CGContextSelectFont устарел. Сообщение об отказе говорит, что я должен использовать Core Text, но я не знаю, что является точным эквивалентом этого фрагмента кода:
CGContextSelectFont(context, "Helvetica", kBarLabelSize, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetRGBFillColor(context, 0, 0, 0, 1.0);
CGContextSetTextMatrix (context, CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0));
CGContextShowTextAtPoint(context, barX, barY, [@"Some text" cStringUsingEncoding:NSUTF8StringEncoding], [barValue length]);
Мне удалось создать шрифт с помощью этого кода:
CFMutableAttributedStringRef attrStr = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica"), kBarLabelSize, NULL);
CFAttributedStringSetAttribute(attrStr, CFRangeMake(0, CFAttributedStringGetLength(attrStr)), kCTFontAttributeName, font);
Но теперь я могу "нарисовать" текст с этим шрифтом в контексте?
Ответы
Ответ 1
Насколько я могу понять из вашего кода, точный эквивалент:
CGContextSetTextDrawingMode(context, kCGTextFill); // This is the default
[[UIColor blackColor] setFill]; // This is the default
[@"Some text" drawAtPoint:CGPointMake(barX, barY)
withAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Helvetica"
size:kBarLabelSize]
}];
Обратите внимание, что ваши вызовы CGContextSetTextDrawingMode
и CGContextSetRGBFillColor
устанавливают значения по умолчанию. Ваш вызов CGContextSetTextMatrix
не нужен при использовании рисунка UIKit следующим образом.
Я понятия не имею, что [barValue length]
здесь. Я предполагаю, что вы просто неправильно использовали это для длины @"Some text"
. (length
- это не количество байтов, которое вам нужно. Возможно, вы имели в виду [barValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding]
).
Обратите внимание, что строковый рисунок UIKit (см. здесь) обертывает основной текст.
Ответ 2
Я обнаружил, по крайней мере, в моем случае, проблема с новым интерфейсом NSString.drawAtPoint заключается в том, что он может перевернуться вверх, в зависимости от того, как вы используете контекст.
Альтернативой является использование методов Core Text, в частности интерфейса CTLine:
NSDictionary *attribs = @{NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:14.0]};
NSAttributedString *fontStr = [[NSAttributedString alloc] initWithString:@"some text" attributes:attribs];
CTLineRef displayLine = CTLineCreateWithAttributedString( (__bridge CFAttributedStringRef)fontStr );
CGContextSetTextPosition( ctx, xPosition, yPosition );
CTLineDraw( displayLine, ctx );
CFRelease( displayLine );
Ответ 3
Вероятно, вы можете использовать следующее, чтобы заменить его.
-
CGContextSetFont
-
CGContextSetFontSize