2013-10-25 8 views
1

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

Снизу изображение, которое вы можете увидеть "Это длинное сообщение более чем 320 ширина изображения, в том, что изображения не приходит.

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

Это код для рисования. Текст:

-(UIImage *)addText:(UIImage *)img text:(NSString *)text1{ 

    int w = img.size.width; 
    int h = img.size.height; 
    //lon = h - lon; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); 
     CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage); 
    CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1); 

    char* text = (char *)[text1 cStringUsingEncoding:NSASCIIStringEncoding]; 

    CGContextSelectFont (context, // 3 
         "Helvetica-Bold", 
         15, 
         kCGEncodingMacRoman); 
    CGContextSetTextDrawingMode(context, kCGTextFill); 
    CGContextSetRGBFillColor(context, 255, 255, 255, 1); 
    CGContextShowTextAtPoint(context, 4, 52, text, strlen(text)); 
    CGImageRef imageMasked = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 
    return [UIImage imageWithCGImage:imageMasked]; 
} 

enter image description here

+0

текст нарисовать обязательно? если нет, использование UILabel проще всего – Jing

+0

На самом деле, я хочу, чтобы текст отображался на изображении, Мое сообщение динамическое, и я должен поместить это сообщение в Image. – krish

+0

Возможно использование ярлыка? – krish

ответ

2

Используйте UIImageView для отображения изображения и добавления UILabel в качестве подзадачи UIImageView.

1.configure ваш UILabel первый:

[yourLabel setNumberOfLines:0]; 
[yourLabel setLineBreakMode:NSLineBreakByWordWrapping]; 

2.Get вашей метки рамки с длиной содержимого

- (CGRect)labelFrameWithText:(NSString *)text 
{ 
    CGRect rect; 

    // the font of your text 
    UIFont *font = [UIFont systemFontOfSize:15.0]; 
    NSDictionary *attributes = @{NSFontAttributeName: font}; 

    // the first parametric CGSize is the max size that the rect's size can be 
    CGRect boundingRect = [title boundingRectWithSize:CGSizeMake(youImageWidth, 100.0) 
               options:NSStringDrawingUsesLineFragmentOrigin 
              attributes:attributes 
               context:nil]; 

    //the rect of the UILabel 
    //This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must use raise its value to the nearest higher integer using the ceil function. 
    rect = CGRectMake(yourLabelOriginX, 
         yourLabelOriginY, 
         ceil(boundingRect.size.width), 
         ceil(boundingRect.size.height)); 

    return rect; 
} 

3.Change кадр вашего лейбла и SetText

--- ---- старая версия ---------

CGSize contentSize = [content sizeWithFont:font 
          constrainedToSize:CGSizeMake(maxWidth, maxHeight) 
           lineBreakMode: NSLineBreakByWordWrapping]; 
+0

, кстати, методы доступны в iOS7.0 и позже -boundingRectWithSize: options: attributes: context: – Jing

+0

, если ваше приложение должно покрывать более раннюю версию, сообщите мне, поэтому я могу дать старый код версии – Jing

+0

Мое приложение должно работать и в старой версии. пожалуйста, предоставьте мне – krish

5

Попробуйте этот код:

lblText.text=[NSString stringWithFormat:@"Put Your Text"]; 
lblText.font = [UIFont fontWithName:@"Helvetica" size:10.0f]; 
CGPoint point=lblText.center; 
imgview.image =[self drawText:lblText.text inImage:imgview.image atPoint:point]; 


    //Save it in Document directory for Checking Purpose... 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"]; 
    UIImage *image1 = imgview.image; // imageView is my image from camera 
    NSData *imageData = UIImagePNGRepresentation(image1); 
    [imageData writeToFile:savedImagePath atomically:NO]; 


-(UIImage *) drawText:(NSString*) text inImage:(UIImage*)image atPoint:(CGPoint)point 
    { 
    UIFont *font =lblText.font;;  
    if ([UIScreen instancesRespondToSelector:@selector(scale)]) { 
      UIGraphicsBeginImageContextWithOptions(imgview.frame.size, NO, 0.0f); 
     } else { 
     UIGraphicsBeginImageContext(imgview.frame.size); 
     } 

     [image drawInRect:CGRectMake(0,0,imgview.frame.size.width,imgview.frame.size.height)]; 
     CGRect rect = CGRectMake(point.x,point.y,lblText.frame.size.width, lblText.frame.size.height);//Set Frame as per your Requirement 
     [lblText.textColor set]; 
     [text drawInRect:CGRectIntegral(rect) withFont:font]; 
     UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

    return newImage; 
} 

Это поможет.

+0

Для чего это условие? ([Экземпляры UIScreenRespondToSelector: @selector (scale)]) – krish

+0

, если масштаб проходит через него, вот масштаб = 0.0f. проверить это -> UIGraphicsBeginImageContextWithOptions (размер CGSize, BOOL непрозрачный, шкала CGFloat) –

+0

@krish 'UIScreen.scale' был представлен в iOS4. «If» проверяет, может ли система автоматически выбирать разрешение шкалы, если true, мы просто устанавливаем шкалу = 0. Для более старой системы 'UIGraphicsBeginImageContext()' устанавливает масштаб по умолчанию = 1.0. Хотя, я думаю, просто используя 'UIGraphicsBeginImageContextWithOptions (imgview.frame.size, NO, 0.0f);' должно быть достаточно, так как оно должно установить масштаб = 1.0 в случае по умолчанию. – chunkyguy