2011-11-15 34 views
6

Tôi muốn tạo một ứng dụng iphone tương tự như một số ứng dụng thiệp chúc mừng, nơi tôi có thể viết văn bản trên một số hình nền đã chuẩn bị trước (thẻ).Thêm văn bản trên hình ảnh trên Xcode

  • Tôi có thể viết văn bản này bằng cách nào?
  • Cách lưu hình nền + văn bản trên một tệp hình ảnh?

Cảm ơn.

+1

Đồ họa chính có thể là đúng hướng. – dasdom

+1

bạn có thể tạo bộ điều khiển trống với thanh trạng thái ẩn và tạo ảnh chụp màn hình sau khi chỉnh sửa xong. Tôi nghĩ rằng UIImagePNGRepresentation là những gì bạn cần cho điều đó. –

+0

Cảm ơn câu trả lời của bạn. Có, tôi nghĩ rằng giải pháp của bạn dễ dàng hơn nhiều so với sử dụng đồ họa cốt lõi tha, tôi sẽ tập trung vào đó. Nếu tôi hiểu, bạn có nghĩa là tôi chuẩn bị hình nền trên một uiview và thêm một uiTextfield với bachground minh bạch trên nó, cho phép người dùng nhập văn bản sau đó thực hiện một scereenshot. Đó có thể là? – hafedh

Trả lời

10

Đây là phương pháp ghi chuỗi vào hình ảnh. Bạn có thể tinh chỉnh kích thước phông chữ và các thông số khác để cấu hình nó theo ý thích của bạn.

/* Creates an image with a home-grown graphics context, burns the supplied string into it. */ 
- (UIImage *)burnTextIntoImage:(NSString *)text :(UIImage *)img { 

UIGraphicsBeginImageContext(img.size); 

CGRect aRectangle = CGRectMake(0,0, img.size.width, img.size.height); 
[img drawInRect:aRectangle]; 

[[UIColor redColor] set];   // set text color 
NSInteger fontSize = 14; 
if ([text length] > 200) { 
    fontSize = 10; 
} 
UIFont *font = [UIFont boldSystemFontOfSize: fontSize];  // set text font 

[ text drawInRect : aRectangle      // render the text 
     withFont : font 
    lineBreakMode : UILineBreakModeTailTruncation // clip overflow from end of last line 
     alignment : UITextAlignmentCenter ]; 

UIImage *theImage=UIGraphicsGetImageFromCurrentImageContext(); // extract the image 
UIGraphicsEndImageContext();  // clean up the context. 
return theImage; 
} 
+0

Cảm ơn Rayfleck, có vẻ tuyệt vời! – hafedh

+0

@Rayfleck Tôi biết đây là một câu trả lời cũ, nhưng tôi chỉ tìm thấy nó ngày hôm nay và nó hoạt động tuyệt vời, vì vậy cảm ơn bạn! Tôi vừa có một câu hỏi. Có cách nào để sửa đổi mã này để vẽ chuỗi theo chiều dọc không? (Văn bản được xoay 90 độ ngược chiều kim đồng hồ) – Ryan

+0

@Ryan - trước tiên xoay hình ảnh CLOCKwise, sau đó ghi vào văn bản, sau đó xoay nó trở lại. Xem tại đây http://www.catamount.com/forums/viewtopic.php?f=21&t=967 để biết một số tiện ích mở rộng UIImage tiện dụng để thực hiện xoay vòng. – Rayfleck

5

Cảm ơn Rayfleck! Nó đã làm việc.

Để thêm khả năng tương thích tùy chọn với màn hình võng mạc (sửa chữ choppy trong phiên bản '@ 2x' của hình ảnh rộng):

thay thế:

UIGraphicsBeginImageContext(img.size); 

với điều kiện:

if (UIGraphicsBeginImageContextWithOptions != NULL) 
    UIGraphicsBeginImageContextWithOptions(img.size,NO,0.0); 
else 
    UIGraphicsBeginImageContext(img.size); 
+0

Cảm ơn Rob, điều này hoạt động độc đáo. Chính xác thì nó đang làm gì? – Ryan

+0

Rất vui được giúp đỡ! Câu lệnh IF là một kiểm tra nhanh để xem liệu UIGraphicsBeginImageContextWithOptions có sẵn hay không (ios4 hoặc mới hơn). Nếu không, thì bạn có thể cho rằng đó không phải là võng mạc. Nếu có, sau đó bạn đang đi qua các tùy chọn: 1 - kích thước của hình ảnh (khu vực văn bản); 2 - nền trong suốt (đục = NO); và 3 - '0.0' cho biết thiết bị sử dụng thang đo của riêng nó (màn hình võng mạc sẽ mặc định là 2.0 (?)) – Rob

0

Cập nhật cho ios7 ...

/* Creates an image with a home-grown graphics context, burns the supplied string into it. */ 
    - (UIImage *)burnTextIntoImage:(NSString *)text :(UIImage *)img { 

     UIGraphicsBeginImageContext(img.size); 

     CGRect aRectangle = CGRectMake(0,0, img.size.width, img.size.height); 
     [img drawInRect:aRectangle]; 

     [[UIColor redColor] set];   // set text color 
     NSInteger fontSize = 14; 
     if ([text length] > 200) { 
      fontSize = 10; 
     } 

     UIFont *font = [UIFont fontWithName:@"Courier" size:fontSize]; 
     NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
     paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail; 


     paragraphStyle.alignment = NSTextAlignmentRight; 
     NSDictionary *attributes = @{ NSFontAttributeName: font, 
             NSParagraphStyleAttributeName: paragraphStyle, 
             NSForegroundColorAttributeName: [UIColor whiteColor]}; 
     [text drawInRect:aRectangle withAttributes:attributes]; 

     UIImage *theImage=UIGraphicsGetImageFromCurrentImageContext(); // extract the image 
     UIGraphicsEndImageContext();  // clean up the context. 
     return theImage; 
    } 
0

Cách tiếp cận này tính đến quy mô của màn hình và nó siêu trực quan

UIImage * img = ... 
    UIImageView * iV = [[UIImageView alloc] initWithImage:img]; 
    UILabel * l = [[UILabel alloc] initWithFrame:iV.bounds]; 
    l.textAlignment = ...; 
    l.adjustsFontSizeToFitWidth = YES; 
    l.textColor = ...; 
    l.font = ...; 
    l.text = ...; 

    [iV addSubview:l]; 

    UIGraphicsBeginImageContextWithOptions(iV.bounds.size, NO, 0); 
    [iV.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage * finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return finalImage 
Các vấn đề liên quan