1

'drawRect'-Functionで手動で描画しているUIViewがあります。これは基本的に座標系であり、Y軸に「値」、「X軸」に「時間」があります。

スペースの問題のため、タイムスタンプを水平ではなく垂直にしたいと思います。この目的のために、私は以下を使用します:

CGContextSaveGState(ctx);              //Saves the current graphic context state
CGContextRotateCTM(ctx, M_PI_2);       //Rotates the context by 90° clockwise
strPos = CGContextConvertPointToUserSpace(ctx, strPos); //SHOULD convert to Usercoordinates
[str drawAtPoint:strPos withFont:fnt]; //Draws the text to the rotated CTM
CGContextRestoreGState(ctx);           //Restores the CTM to the previous state.

ctx(CGContextRef)、strPos(CGPoint)、およびstr(NSString)は変数であり、テキストの高さの幅で「水平テキスト」に対して適切かつ正しく初期化されています。

このコードはiPhone3で問題なく動作しますが、iPhoneの座標系は同じであると想定されていても、CGContextConvertPointToUserSpace関数はまったく異なる結果を生成するため、iPhone 4(Retina)では完全に混乱します。

また、CGAffineTransformを使用してみましたが、同じ結果になりました。

私の質問を要約すると、親座標系の計算された位置(0、0は左上)にテキストを描画するにはどうすればよいですか?


Quartz 2Dに関するAppleのドキュメントをもう一度調べた後、Pi / 2による回転により、すべての書き込み画面が左に移動することに気付きました。

CTMを+heightで変換することにより、書き込みを縦線で表示させることができます。私は努力を続けますが、それでも答えを得ることができれば幸いです。

編集:lawickoのヘッズアップのおかげで、私は問題を解決することができました。詳細については、回答を参照してください。

4

1 に答える 1

0

これを指摘してくれたlawickoに感謝します。私のテスト中に私は2つの間違いを犯しました...しかし彼はもちろん正しいです。CGContextShowTextAtPointの使用は、CTM全体の回転を必要としないため、最も簡単なソリューションです。

再びありがとう。さて、私の質問に対する実際の答えです。回転したテキストをx/yの位置に描画するには、次のコードが有効です。

CGAffineTransform rot = CGAffineTransformMakeRotation(M_PI_2);    //Creates the rotation
CGContextSelectFont(ctx, "TrebuchetMS", 10, kCGEncodingMacRoman); //Selects the font
CGContextSetTextMatrix(ctx, CGAffineTransformScale(rot, 1, -1));  //Mirrors the rotated text, so it will be displayed correctly.
CGContextShowTextAtPoint(ctx, strPos.x, strPos.y, TS, 5);         //Draws the text

ctxはCGContext、strPosは親座標系の目的の位置、TSはchar配列です。

繰り返しになりますが、lawickoに感謝します。あなたの提案がなければ、私はおそらく永遠に検索したでしょう。たぶん、この答えは、同じ問題に遭遇した他の誰かを助けるでしょう。

于 2012-07-20T07:05:00.630 に答える