В первый день на новой работе меня попросили помочь с приложением для iPad. Они попросили меня нарисовать NSString вдоль изогнутого пути (кривая похожа на S-образную форму).
Не совсем уверен, как это сделать, не перебирая буквы строки и рисуя каждую букву отдельно после поворота и перемещения ее рамки. Есть ли более эффективный способ сделать это?
Вот что у меня есть до сих пор:
-(void)doCurveString:(NSString *)stringToCurve{
UIGraphicsBeginImageContext(CGSizeMake(768, 1024));
NSArray *arrayFullOfCGRects = [NSArray arrayWithObjects:
[NSValue valueWithCGRect:CGRectMake(300, 500, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(315, 510, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(330, 500, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(345, 510, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(360, 500, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(375, 510, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(390, 500, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(405, 510, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(420, 500, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(435, 510, 20, 20)],
nil];
NSArray *arrayFullOfRotateTransforms = [NSArray arrayWithObjects:
[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI/4)],
[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI/2)],
[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI/1)],
[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI/4)],
[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI/2)],
[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI/1)],
[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI/3)],
[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI/5)],
[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI/6)],
[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_PI/1)],
nil];
NSDictionary *drawDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
arrayFullOfCGRects, @"frames",
arrayFullOfRotateTransforms, @"rotations",
nil];
for(NSInteger charIndex=0; charIndex<stringToCurve.length; charIndex++){
//Create a label and set it's frame coordinates
UILabel *labelToDraw = [[UILabel alloc] initWithFrame:[[[drawDictionary objectForKey:@"frames"] objectAtIndex:charIndex] CGRectValue]];
//Rotate the letter with the transform stored in the array
labelToDraw.transform = [[[drawDictionary objectForKey:@"rotations"] objectAtIndex:charIndex] CGAffineTransformValue];
//Set the label text to the letter at the correct index
labelToDraw.text = [NSString stringWithFormat:@"%C", [stringToCurve characterAtIndex:charIndex]];
//Make sure the background colour is transparent
labelToDraw.backgroundColor = [UIColor clearColor];
//Draw it to the view controller view
[self.view addSubview:labelToDraw];
}
UIGraphicsEndImageContext();
Наверняка должен быть лучший способ? Метод drawTextOnPath:someCGPath, о котором я не знаю/не могу найти?