2010-02-23 20 views
10

Trong ứng dụng của tôi, tôi đang cố gắng hiển thị văn bản dọc theo một đường dẫn; điều này là tốt cho hầu hết các nhân vật nhưng không phải cho tiếng Nhật (hoặc bất cứ điều gì không mac-Roman). Tôi đã được khuyên nên sử dụng [NSString drawAtPoint] để hiển thị các ký tự chính xác trong CATiledLayer của tôi; tuy nhiên, chúng biến mất sau khoảng 5 giây. Trong thời gian này tôi có thể phóng to các lớp và họ quy mô đúng cách, nhưng họ dường như không nhận được cam kết với CATiledLayer như phần còn lại của văn bản thường là.Sử dụng phương pháp drawAtPoint của NSString thay cho các vấn đề CGContextShowGlyphsAtPoint

Trước khi tôi kết xuất, tôi kiểm tra chuỗi và quyết định xem có bất kỳ biểu tượng nào trong số chúng không thể hiển thị hay không. Nếu tôi có vấn đề, tôi sử dụng drawAtpoint thay thế:

if (!isFullyDisplayable) 
{ 
    CGContextShowGlyphsAtPoint(context, pt.x, pt.y, realGlyph, 1); 
} 
else { 
    // fall back on less flexible font rendering for difficult characters 

    NSString *b = [gv text]; 
    NSString *c = [b substringWithRange:NSMakeRange(j,1)]; 

    [c drawAtPoint:pt withFont:[UIFont fontWithName:@"Helvetica-Bold" size:16.0]]; 


} 

Có ai có bất kỳ gợi ý nào về lý do văn bản biến mất không?

Ngay khi drawAtPoint được sử dụng kết xuất debug của tôi được tràn ngập:

<Error>: CGContextGetShouldSmoothFonts: invalid context 
<Error>: CGContextSetFont: invalid context 
<Error>: CGContextSetTextMatrix: invalid context 
<Error>: CGContextSetFontSize: invalid context 
<Error>: CGContextSetTextPosition: invalid context 
<Error>: CGContextShowGlyphsWithAdvances: invalid context 

Vì vậy, tôi đoán nó là một cái gì đó để làm với quản lý bối cảnh của tôi, nhưng tôi cho rằng nếu điều này là trong cùng một nơi như tôi sử dụng CGContextShowGlyphsAtPoint nó phải có bối cảnh chính xác đã?

Trả lời

17

Trả lời câu hỏi của riêng tôi:

NSString drawAtPoint: withFont: tận dụng ngăn xếp bối cảnh, và từ đó tôi đã gọi phương pháp này ngăn xếp hoàn toàn trống rỗng. Kết hợp cuộc gọi với

UIGraphicsPushContext(context); and UIGraphicsPopContext(); 

thực hiện thủ thuật.

+1

Bạn nên đề cập rằng tính năng này chỉ hoạt động trên iOS 4.0 trở lên. Các tiện ích mở rộng đồ họa UIKit không an toàn với luồng trong các FW cũ hơn. – Split

1

Để có đầy đủ, đây là mã cần thiết cho Cocoa. Cũng làm việc với .drawInRect ...

CGContextSaveGState(context) 
let old_nsctx = NSGraphicsContext.currentContext() // in case there was one 
// force "my" context... 
NSGraphicsContext.setCurrentContext(NSGraphicsContext(CGContext: context, flipped: true)) 

// Do any rotations, translations, etc. here 
str.drawAtPoint(cgPt, withAttributes: attributes) 

NSGraphicsContext.setCurrentContext(old_nsctx)// clean up for others 
CGContextRestoreGState(context) 

này thường không cần thiết, như @davbryn nói, như thường đã có một "làm việc" bối cảnh trên stack đó là như nhau (bạn hy vọng!) Như bối cảnh của bạn, tuy nhiên, như ông chỉ ra, đôi khi không có. Tôi phát hiện ra vấn đề này đặc biệt với MapKit MKOverlayRenderer 's drawMapRect:, mà chỉ đơn giản là sẽ không hiển thị văn bản mà không cần thiết lập bối cảnh một cách rõ ràng.

Các vấn đề liên quan