2010-01-29 76 views
3

我的博客在此之前已經被提及作爲對問題的回答。我無法鏈接到其中的一個,因爲此表單聲稱我是垃圾郵件發送者。嘆。無論如何,現在我想寫一個關於繪製旋轉文本的權威博客文章,所以它也可以用於這裏的答案(heh)。這是我第一次嘗試:如何繪製旋轉文字而不限於MacRoman字符集?

http://www.platinumball.net/blog/2009/06/01/drawing-nsstrings-in-unusual-rotations/

行之有效,但它確實我想要的一切,除了它使用CGContextSelectFont事實(),這限制文本輸出爲macroman。那是Teh Sukk。

我一直在尋找這個問題近一年的答案,包括幾次搜索這個網站,沒有成功。我見過的例子看起來與我想要的很接近,但顯然我太愚蠢了,不能將它們屈服於我的意願。我包含了我寫的NSString類的主要方法,它顯示了我正在做的事情的膽量。如果您需要查看代碼的其餘部分,可以從鏈接下載到我上面給出的博客。謝謝...後

-(void)drawAtPoint:(CGPoint)point withFont:(UIFont*)font 
orientation:(WBOrientation)orient 
{ 
    CGContextRef  ctxt = [self contextSave]; 
    const std::string tbuf = toStdString(self, NSMacOSRomanStringEncoding); 
    CGAffineTransform tran = CGAffineTransformMake(1, 0, 0, -1, 0, 0); 

    switch (orient) 
    { 
     case WBOrientUp: 
     // nothing to do 
     break; 

     case WBOrientDown: 
     tran = CGAffineTransformRotate(tran, degreesToRadians(180.0)); 
     break; 

     case WBOrientLeft: 
     tran = CGAffineTransformRotate(tran, degreesToRadians(90.0)); 
     break; 

     case WBOrientRight: 
     tran = CGAffineTransformRotate(tran, degreesToRadians(-90.0)); 
     break; 

     default: 
     assert(false); 
     break; 
    } 

    contextFont(ctxt, font); 
    CGContextSetTextDrawingMode(ctxt, kCGTextFill); 
    CGContextSetTextMatrix(ctxt, tran); 
    CGContextSetTextPosition(ctxt, point.x, point.y); 
    CGContextShowText(ctxt, tbuf.c_str(), tbuf.length()); 

    [self contextRestore:ctxt]; 
} 
+0

Allen:刪除了您的博客文章。你說你需要'const char *'s並且很難得到它們。 NSString有一個'-cStringUsingEncoding:'方法,它似乎直接執行你所需要的操作(參見圍繞它的內存管理文檔)。只是FYI。 – 2010-01-29 17:07:07

回答

1

只有幾天我做到了我自己=)

這是我如何解決它:

view.layer.transform = CATransform3DRotate(view.layer.transform, 3.1415, 0,0,1); // this is for 180 degrees. 
+0

你能澄清我將如何使用它嗎?我可能不得不創建一個我不熟悉的圖層。我將如何設置180度以外的旋轉。我想我應該提到我是一個完整的數學白癡。可能爲什麼我在一年的嘗試中無法解決這個問題。 – 2010-01-29 17:17:08

+0

@Allen:所有的UIView都有一個Core Animation層,它可以通過.layer屬性訪問。 360度等於2 * pi弧度。 180度是pi或3.1415。 – Darren 2010-01-30 03:18:34

+0

好的,如果我正在繪製到UIView中,這樣就可以工作。但是看起來,我無法使我的原始API工作,即繪製到當前的上下文中,因爲它可能不是視圖。 如果有人知道如何在繪製到不一定是視圖的上下文時進行這項工作,我很樂意聽到它。 – 2010-01-30 15:23:41

1

設置CGContext上爲使用the UIGraphicsPushContext function當前圖形上下文,然後draw the string using UIKit,然後使用the UIGraphicsPopContext function將背景彈出堆棧。

的AppKit的(Mac)中的解決方法是基本相同的,使用用於第2步在-[NSView drawRect:]窗口上下文NSGraphicsContext對於步驟1和AppKit's NSString additions,步驟3消失(你將獲得來自NSGraphicsPort的CGContext上在步驟1中,意義它已經設置);對於其他上下文(如位圖或PDF上下文),您將在步驟1和步驟3中使用相同的NSGraphicsPort方法(setCurrentContext:)。

+0

聽起來不錯,但我無法讓它工作。我刪除了這一行: CGContextShowText(ctxt,tbuf.c_str(),tbuf。長度()); 並將其替換爲: UIGraphicsPushContext(ctxt); [self drawAtPoint:point withFont:font]; UIGraphicsPopContext(); 通過這些更改,文本被繪製,但不再旋轉。我也嘗試刪除contextFont()調用,但這種方式沒有任何效果。我正在iPhone模擬器中進行測試。 – 2010-01-31 11:43:52

+0

Allen Brunson:好的,現在你的問題中存在代碼,我可以看到你不需要設置當前上下文,因爲你從'UIGraphicsGetCurrentContext'獲得了上下文,即它已經是最新的。因此,請剪切'PushContext'和'PopContext'調用,並使用UIKit繪圖方法。 「UIKit不提供除標準水平之外的任何其他方向繪製文本的方法」......在上下文的座標系中,您通過更改其上下文的當前變換矩陣來旋轉該座標系。 – 2010-01-31 14:43:29

+0

對不起,但那也行不通! (自從我第一次發佈代碼示例以來,這個代碼示例就已經出現了。)我正在嘗試重新啓動我的大腦,並且我認爲當我最初編寫該類別時,我嘗試了這一點。 UIStringDrawing方法似乎並不尊重當前上下文的旋轉。這就是爲什麼我選擇了低級CG方法的原因。 我很想在這裏被證明是錯誤的。也許還有一些其他細節我錯了?寫一個替代我的方法,但在不同的旋轉中繪製文本,並贏得互聯網。 – 2010-01-31 18:41:29