2011-07-10 124 views
1

我想通過繪製一些文本到NSView通過CGContextShowTextAtPoint()。這很好,直到我覆蓋(BOOL)isFlipped以在我的NSView子類中返回YES,以便將原點定位在左上方以進行繪製。文本吸引了預期的區域,但是這些字母都是倒置的。我也嘗試了翻轉我的CGContext(翻譯上下文的高度)(理論上至少)。CGContextShowTextAtPoint渲染顛倒

e.x.

// drawRect: 
CGContextScaleCTM(theContext, 1, -1); 
CGContextTranslateCTM(theContext, 0, -dirtyRect.size.height); 

這產生了相同的結果。

對類似問題的許多建議都指向修改文本矩陣。我已經將文本矩陣設置爲單位矩陣,對其進行了額外的反演,並分別完成了這兩個操作。所有這些解決方案都導致文本的渲染效果更加陌生(通常只是出現一個片段)。

我看到的另一個建議是簡單地避開此功能,以支持其他繪圖文本方式(例如NSString的s )然而,這主要是在C++/C中完成的,如果可能的話,我想保持這些級別。

任何建議非常感謝,我很樂意發佈更多的代碼,如果需要的話。

感謝, 山姆

回答

0

原來答案是修改文本矩陣。出現的奇怪「碎片」而不是文本是因爲當替換「默認」文本矩陣時,字體大小(通過CGContextSelectFont()設置)太小。出於某種原因,初始矩陣出現了大規模變換,因此當矩陣未被修改時,較小的文本大小看起來很好;當用反比例(1,-1)或單位矩陣代替時,它們會變得不可思議地變小。

1

您需要使用視圖的邊界,而不是dirtyRect和規模之前執行轉換:

CGContextTranslateCTM(theContext, 0, -NSHeight(self.bounds)); 
CGContextScaleCTM(theContext, 1, -1); 
+0

謝謝你的建議,但命令似乎沒有影響。直接使用您的代碼導致繪圖在屏幕外渲染並將NSHeight(...)更改爲NSHeight(...)導致正確的原點更改,但文本問題依然存在。 – Sam

2

此問題已經回答here

基本上,這是因爲iOS核心圖形上的座標系翻轉(左上角的x:0, y:0)與Mac上的座標系相反(其中x:0, y:0是左下角)。解決方案是這樣設置文本轉換矩陣:

CGContextSetTextMatrix(context, CGAffineTransformMake(1.0,0.0, 0.0, -1.0, 0.0, 0.0));