Символ Unicode Не Отображается
Я хочу отобразить символ "бесконечность" с помощью
CGContextSelectFont(context, "HelveticaNeue", textSize, kCGEncodingMacRoman);
CGContextShowTextAtPoint(context, myCenter.x, myCenter.y + textHeight, [sName cStringUsingEncoding:NSMacOSRomanStringEncoding], [sName length]);
отображается в виде квадрата или круга. Я узнал, что этот символ находится в десятичном 176 и 221E в шестнадцатеричном формате. Я использую Helvetica в качестве шрифта и пробовал другие без успеха. Это проблема с кодировкой, которую я использую?
4 ответов
оказывается, что CGContextSelectFont поддерживает только кодировку Макромена, которая в основном имеет только небольшой набор символов. Для отображения символов Юникода в строке необходимо использовать CGSetFont или систему рисования Cocoa. CGSetFont требует, чтобы вы все равно использовали Cocoa для сопоставления символов с глифами, а затем рисовали глифы с помощью CGContextShowGlyphsAtPoint. Я рекомендую вам изучить другие способы рисования этих строк, Если вам действительно нужно отобразить Unicode письмена.
этот код в основном будет отображать символ бесконечности:
- (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.
стоит отметить, что вы все еще можете использовать функции CGContext вместе с -[NSString drawwwithrect:] и его двоюродными братьями. Например, следующий код рисует строку (которая может включать любые символы, включая символ бесконечности, который начал эту тему) с 50%-непрозрачный черный:
CGContextSaveGState(context);
CGContextSetRGBFillColor(context, 0, 0, 0, 0.5);
[self.text drawInRect:targetRect withFont:self.font];
CGContextRestoreGState(context);
вот ответ 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 ()
вы хотите, чтобы избежать drawInRect:withFont: (в есть некоторые подробности: шнурок (шпагат, RectangelF, UIFont шрифт) как этот API до тех пор, пока троянца iPhoneOS 4.0 не оказывает строки, которые могут содержать некоторые символы Unicode (как "со странностями") и будут молча резать отображения в этой точке.
вместо этого вы должны использовать drawInRect:withFont:lineBreakMode:alignment: (в MonoTouch это шнурок (строка msg, прямоугольник rect, шрифт UIFont, uilinebreakmode breakMode, uitextalignment align) метод) как это делает правильно.
кроме того, не все шрифты на iPhone-это полный набор шрифтов, вы можете использовать следующую ссылку:
http://daringfireball.net/misc/2007/07/iphone-osx-fonts
список шрифтов, которые имеют полный набор символов.