2009-05-25 40 views
8

Tại sao khó tìm ra cách vẽ các ký tự Unicode trên iPhone, tạo ra các chỉ số phông chữ đơn giản trên đường đi, chẳng hạn như độ rộng của mỗi hình ảnh sẽ nằm trong phông chữ của sự lựa chọn?Vẽ các ký tự Unicode trên iPhone

Dường như nó sẽ dễ dàng với NSLayoutManager, nhưng API đó dường như không có sẵn trên điện thoại. Dường như cách mọi người làm điều này là sử dụng API riêng, CGFontGetGlyphsForUnichars, điều này sẽ không giúp bạn vượt qua những người gác cổng của Apple vào cửa hàng ứng dụng.

Ai có thể chỉ cho tôi tài liệu hướng dẫn cách thể hiện điều này không? Tôi đang mất tóc nhanh chóng.

Howard

Trả lời

3

Tôi cho rằng việc loại trừ CGFontGetGlyphsForUnichars
là một giám sát chứ không phải là một động thái thận trọng, tuy nhiên tôi không phải là
cá cược các trang trại vào nó. Vì vậy, thay vào đó tôi sử dụng

[NSString drawAtPoint:withFont:]; (trong UIStringDrawing.h)

[NSString sizeWithFont];

này cũng có lợi thế là thực hiện thay đàng hoàng
trên nhân vật mất tích từ phông chữ của bạn, điều mà
CGContextShowGlyphs không làm.

+0

Bạn biết: gần như vậy. Điều đó đảm bảo nhu cầu của tôi để hình ảnh nhân vật, nhưng không phải để có được số liệu phông chữ đơn giản cho nó. Biến ra tho mà bạn có thể nhảy vào và ra khỏi ngữ cảnh hiện tại ('UIGraphicsGetCurrentContext') và sử dụng' CGContextGetTextPosition' trước và sau khi vẽ về cơ bản có được chiều rộng của hộp giới hạn. Đó là chủ yếu là những gì tôi quan tâm đến bắt nguồn, vì vậy cảm ơn bạn! – hkatz

+0

Chờ đã, có gì sai với '[@" a "sizeWithFont: ]'? Tại sao bạn cần số liệu cho từng ký tự? –

+0

Nó cho tôi số liệu bởi vì tôi làm sizeWithFont cho mỗi ký tự. Andrew: Có lẽ anh ta muốn lưu các ký tự vào một kết cấu hoặc vẽ chúng theo một đường dẫn. –

0

CoreText là câu trả lời nếu bạn muốn vẽ unicode thay vì CGContextShowGlyphsAtPositions. Ngoài ra nó tốt hơn so với [NSString drawAtPoint:withFont:] nếu bạn cần bản vẽ tùy chỉnh. Dưới đây là ví dụ hoàn chỉnh:

CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)attributedString); 
CFArrayRef runArray = CTLineGetGlyphRuns(line); 

//in more complicated cases make loop on runArray 
//here I assumed this array has only 1 CTRunRef within 
const CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runArray, 0); 

//do not use CTFontCreateWithName, otherwise you won't see e.g. chinese characters 
const CTFontRef font = CFDictionaryGetValue(CTRunGetAttributes(run), kCTFontAttributeName); 

CFIndex glyphCount = CTRunGetGlyphCount(run); 
CGGlyph glyphs[glyphCount]; 
CGPoint glyphPositions[glyphCount]; 

CTRunGetGlyphs(run, CFRangeMake(0, 0), glyphs); 
//you can modify positions further 
CTRunGetPositions(run, CFRangeMake(0, 0), glyphPositions); 

CTFontDrawGlyphs(font, glyphs, glyphPositions, glyphCount, context); 
CFRelease(line);