2017-01-23 13 views
0

ストロークに沿ってテキストを回転しようとしています。ユーザーはタッチでストロークを作成し、指が望む方向に移動すると、ストロークは指があるポイントまでスケーリングされます。私はストロークに沿って現在の長さを表示し、テキストショーはストロークで縮尺を変えずに回転します。ストロークに沿ってテキストを描画して回転する

私はそれほど離れていないと思います。現在のところ、テキストは常に正しい位置にあるわけではなく、回転によって異なります。コンテキストトランスレーションには何か問題があると思いますが、自分のコードを見ることができます。

これは、テキストを描画するための私の方法です:

- (void)drawText:(NSString *)text withFrame:(CGRect)rect withFont:(UIFont *)font rotation:(float)radians alignment:(NSTextAlignment)alignment context:(CGContextRef)context { 
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping; 
paragraphStyle.alignment = alignment; 

NSDictionary *attributes = @{ NSFontAttributeName: font, 
           NSParagraphStyleAttributeName: paragraphStyle, 
           NSForegroundColorAttributeName: [UIColor blackColor] }; 

CGContextSaveGState(context); 
CGContextScaleCTM(context, 1.0, 1.0); 
//CGRect textSize = [text boundingRectWithSize:rect.size options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil]; 
CGContextTranslateCTM(context, rect.origin.x + (rect.size.width * 0.5), rect.origin.y + (rect.size.height * 0.5)); 
CGContextRotateCTM(context, radians); 
CGContextTranslateCTM(context, -(rect.origin.x + (rect.size.width * 0.5)), -(rect.origin.y + (rect.size.height * 0.5))); 

[[UIColor redColor] set]; 
CGContextFillRect(context, rect); 

[text drawInRect:rect withAttributes:attributes]; 

CGContextRestoreGState(context); 
} 

私はこのようにそれを呼び出す:

CGFloat a = shapeToBeDrawn.startPoint.y - shapeToBeDrawn.endPoint.y; 
CGFloat c = shapeToBeDrawn.length; 
CGFloat alpha = -asin(a/c); 

CGRect r = CGRectMake(shapeToBeDrawn.startPoint.x, shapeToBeDrawn.startPoint.y - 30, shapeToBeDrawn.endPoint.x - shapeToBeDrawn.startPoint.x, 20); 
[self drawText:lengthStr withFrame:r withFont:[UIFont fontWithName:@"Helvetica" size:18.0f] rotation:alpha alignment:NSTextAlignmentCenter context:context]; 

ありイム計算角度αと私が表示したい文字列を渡します。また、図形の枠の上にあるテキストの枠も作成します。ここで

それが現在どのように見えるかの小さなビデオ:

Click

は、誰かが私を助けることができると私の問題がクリアされている願っています。おかげ:)

+0

そして、何のコード部分のための位置を規定しますテキスト出力? – MBo

+0

"drawText"メソッド呼び出しの上のコード。そこに私はrectを定義します。 – Werewolve

答えて

1

、全ての象限に適切に角度を算出RECTを定義するatan2機能

alpha = atan2(endPoint.y - startPoint.y, endPoint.x - startPoint.x) 

を使用する - 回転矩形の座標を開始する計算:

x0 = startPoint.x + Sin(alpha) * 30 
y0 = startPoint.y - Cos(alpha) * 30 
rect.width = shapeToBeDrawn.length 
+0

ありがとうございますが、何も変わりません。 – Werewolve

+0

私はビデオで角度が2,3象限で完全に間違っているのを見ました - atan2を使用してこの問題を修正する必要があります。 – MBo

+0

なぜ "30"? 2つの改善点を追加しましたが、それは役に立ちません。 CGRect r = CGRectMake(shapeToBeDrawn.startPoint.x + sin(alpha)* 30、shapeToBeDrawn.startPoint.y - cos(alpha)* 30) - 30、shapeToBeDrawn.endPoint.x - shapeToBeDrawn.startPoint.x、20); – Werewolve

関連する問題