سؤال

أنا أعمل على تطبيق حيث أستخدم CGContextShowTextAtPoint لعرض النص إلى الشاشة. أريد أيضا عرض الأحرف اليابانية، ولكن CGContextShowTextAtPoint يأخذ كدخل لها سلسلة C. إما إما أ) كيف يمكنني تغيير الأحرف اليابانية إلى سلسلة C؟ إذا لم يكن ذلك ممكنا، ب) كيف يمكنني طباعة الأحرف اليابانية يدويا إلى الشاشة (ضمن طريقة الرحلة).

شكرا مقدما.

هل كانت مفيدة؟

المحلول

Coretext يمكن أن تساعدك:

  1. CTFontGetGlyphsForCharacters (iOS 3.2 وما بعده) خرائط أحرف Unicode إلى Glyphs
  2. CTFontDrawGlyphs (IOS 4.2 وما بعده) يرسم الخطي في cgcontext.

ملحوظة CGContextShowGlyphs يجب أن تعمل، لكنني لم أجد أي طريقة لتحويل أيهايهايها إلى الحروف الرسومية. المزيد عن ذلك هنا:

القديمة، ما قبل iOS 3.2 الإجابة

تحتاج إلى استخدام Uikit لهذا.

الدفع [NSString drawAtPoint:...] للبدء.

هذه حتى سؤال مفيد أيضا.

لا أعرف ما كانوا يفكرون فيه مع الأشياء النكورية للنص، فهو عديم الفائدة.

نصائح أخرى

تمكنت من الحصول على هذا العمل باستخدام إعادة استخدام CGFONTGETGYPHSFORUNICHARS بواسطة Jens EgeBlad: glyphdrawing.mm.

قم أولا بالتحميل في خط ياباني كملف OTF من حزمة التطبيق:

// Load font file from otf file
NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"HStdNW8" ofType:@"otf"];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);
CGFontRef _cgFont = CGFontCreateWithDataProvider(fontDataProvider);
CGDataProviderRelease(fontDataProvider);

ثم يمكنك تحويل نص Unichar الخاص بك إلى Glyphs ورسمها:

NSString *text = @"日本語"
CGContextSetFont(context, _cgFont);
CGContextSetFontSize(context, 12);
CGGlyph textGlyphs[[text length]];

unichar textChars[[text length]];
for(int i = 0; i < [text length]; i++) {
    textChars[i] = [text characterAtIndex:i];
}
CMFontGetGlyphsForUnichars(_cgFont, textChars, textGlyphs, [text length]);
CGContextShowGlyphsAtPoint(context, xCoord, yCoord, textGlyphs, [text length]);

لأن ما يستحقه، قضيت وقتا طويلا في محاولة للحصول على الشخصيات اليابانية للعمل بشكل جيد في Coregraphics، ولم يعجبني المكان الذي تركتني.

في النهاية قمت بتسجيلها لاستخدام Uilabels للتعامل مع النص. يمكن تكرار جميع الاشياء التي تشبه coregraphics التي احتاجها نسخ متماثل استخدام دعم التحويل والرسوم المتحركة، وفي النهاية كان التعليمات البرمجية الناتجة أكثر بساطة.

قد لا يكون مناسبا لوضعك، لكن الأمر يستحق النظر.

هذا ربما يساعدك٪ المواضيع بداية٪. بفضل الأطراف الإيقاعية للنصيحة الكبيرة!

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSelectFont (context, [self.font.fontName cStringUsingEncoding:NSASCIIStringEncoding], self.font.pointSize, kCGEncodingMacRoman);
    CGContextSetCharacterSpacing(context, characterSpacing);
    CGContextSetFillColorWithColor(context, [self.textColor CGColor]);
    CGAffineTransform myTextTransform = CGAffineTransformScale(CGAffineTransformIdentity, 1.f, -1.f );
    CGContextSetTextMatrix (context, myTextTransform);

    CGGlyph glyphs[self.text.length];
    CTFontRef fontRef = CTFontCreateWithName((CFStringRef)self.font.fontName, self.font.pointSize, NULL);
    CTFontGetGlyphsForCharacters(fontRef, (const unichar*)[self.text cStringUsingEncoding:NSUnicodeStringEncoding], glyphs, self.text.length);
    float centeredY = (self.font.pointSize + (self.frame.size.height- self.font.pointSize)/2)-2;
    CGContextShowGlyphsAtPoint(context, rect.origin.x, centeredY, (const CGGlyph *)glyphs, self.text.length);
    CFRelease(fontRef);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top