2017-01-23 23 views
0

Я пытаюсь повернуть текст вдоль штриха. Пользователь может создавать штрихи прикосновением и перемещать палец в нужном направлении, затем штрих затем масштабируется до точки, где находится палец. Я хочу показать текущую длину вдоль штриха и шкалу останова текста и повернуть с тактом.Рисовать и вращать текст одним движением

Я думаю, что им не так далеко от рабочего решения. В настоящее время текст не всегда находится в правильном положении, его зависит от поворота. Я думаю, что что-то не так с Context Translation, но позволяет увидеть мой код.

Это мой метод, чтобы нарисовать текст:

- (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. Там я определяю прямоугольник. – Werewolve

ответ

1

Чтобы вычислить угол должным образом во всех квадрантах, используйте 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"? Добавлено два улучшения, но это не помогает. Прямой текст теперь создается таким образом: CGRect r = CGRectMake (shapeToBeDrawn.startPoint.x + sin (alpha) * 30, (shapeToBeDrawn.startPoint.y - cos (alpha) * 30) - 30, shapeToBeDrawn.endPoint.x - shapeToBeDrawn.startPoint.x, 20); – Werewolve

 Смежные вопросы

  • Нет связанных вопросов^_^