Символ Unicode не отображается - PullRequest
7 голосов
/ 09 ноября 2008

Я хочу отобразить символ бесконечности, используя

CGContextSelectFont(context, "HelveticaNeue", textSize, kCGEncodingMacRoman);    
CGContextShowTextAtPoint(context, myCenter.x, myCenter.y + textHeight, [sName     cStringUsingEncoding:NSMacOSRomanStringEncoding], [sName length]); 

Отображается в виде квадратной рамки или круга. Я обнаружил, что этот символ в десятичном формате 176 и 221E в шестнадцатеричном формате. Я использую Helvetica в качестве своего шрифта и пробовал другие без удачи. Это проблема с кодировкой, которую я использую?

Ответы [ 4 ]

12 голосов
/ 09 ноября 2008

Оказывается, что CGContextSelectFont поддерживает только кодировку MacRoman, которая в основном имеет только небольшой набор символов. Для отображения символов Юникода в строке необходимо использовать CGSetFont или систему рисования Какао. CGSetFont требует, чтобы вы все равно использовали Какао для сопоставления символов с глифами, а затем рисовали глифы с помощью CGContextShowGlyphsAtPoint. Я рекомендую вам изучить другие способы рисования этих строк, если вам действительно нужно отображать символы Юникода.

Этот код в основном будет отображать символ бесконечности:

- (void)drawRect:(CGRect)rect {
    unichar inf = 0x221E; // infinity symbol
    NSString* sName = [[NSString alloc] initWithCharacters:&inf length:1];
    UIFont* font = [UIFont fontWithName:@"Helvetica" size:32.0];
    [sName drawInRect:CGRectMake(20, 20, 40, 40)
             withFont:font];
    [sName release];
}

Также обратите внимание, что на iPhone (и на Mac) Helvetica Neue на самом деле не существует ... его название просто соответствует стандартному Helvetica. См. Таблицу в http://daringfireball.net/misc/2007/07/iphone-osx-fonts для получения дополнительной информации о доступных шрифтах на iPhone.

2 голосов
/ 25 декабря 2008

Стоит отметить, что вы все еще можете использовать функции CGContext наряду с [NSString drawWithRect:] и его кузенами. Например, следующий код рисует строку (которая может включать любые символы, включая символ бесконечности, с которого был начат этот поток) с 50% -покрытием черного цвета:

CGContextSaveGState(context);
CGContextSetRGBFillColor(context, 0, 0, 0, 0.5);
[self.text drawInRect:targetRect withFont:self.font];
CGContextRestoreGState(context);
1 голос
/ 27 июня 2013

Вот ответ MonoTouch:

UIGraphics.PushContext (mBmpContext);
mBmpContext.SetRGBFillColor(1f,1f,1f,1f);
var font = UIFont.FromName ("Arial", 30);
using (var nsstr = new NSString ("äöü ÜÖÄ")){
   nsstr.DrawString (new PointF (10, 400), font);
}
UIGraphics.PopContext ()
0 голосов
/ 22 июля 2010

Вы хотите избегать drawInRect: withFont: (в MonoTouch: DrawString (string, RectangelF, шрифт UIFont) в качестве этого API до тех пор, пока iPhoneOS 4.0 не будет отображать строки, которые могут содержать определенные символы Юникода (например, дингбаты), и автоматически отключать рендеринг. в этот момент.

Вместо этого вы должны использовать drawInRect: withFont: lineBreakMode: alignment: (в MonoTouch это метод DrawString (строка msg, RectangleF rect, шрифт UIFont, UILineBreakMode breakMode, UITextAlignment align)), так как это отображается правильно.

Кроме того, не все шрифты на iPhone представляют собой полный набор шрифтов, вы можете воспользоваться следующей ссылкой:

http://daringfireball.net/misc/2007/07/iphone-osx-fonts

Список шрифтов с полным набором символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...