Как преобразовать содержимое uitextview в изображение нестандартного размера?

Я создаю uitextview и могу добавлять к нему текст и изображения с помощью NSAttributedString и NSTextAttachment

  self.tvContent = [[UITextView alloc] initWithFrame:CGRectMake(0, 20, 
  self.view.frame.size.width, self.view.frame.size.height - 64)];
  self.tvContent.font = [UIFont fontWithName:@"Arial" size:16.0f];
  self.tvContent.backgroundColor = [UIColor whiteColor];
  self.tvContent.textContainerInset = UIEdgeInsetsMake(10, 10, 10, 10);
  self.tvContent.contentInset = UIEdgeInsetsMake(0, 0, 10, 0);
  self.tvContent.layoutManager.allowsNonContiguousLayout=NO;
  [self.view addSubview:self.tvContent];

И я конвертирую его содержимое в изображение с помощью следующего кода

  - (UIImage *)imageFromView:(UITextView *)view {
    CGRect tmpFrame = self.view.frame;
    CGRect aFrame = view.frame;
    aFrame.size.height  = [view sizeThatFits:[[UIScreen mainScreen] bounds].size].height;
    view.frame = aFrame;
    UIGraphicsBeginImageContext([view sizeThatFits:[[UIScreen mainScreen] bounds].size]);
    CGContextRef resizedContext = UIGraphicsGetCurrentContext();
    [view.layer renderInContext:resizedContext];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    view.frame = tmpFrame;
    return image;
 }

Максимальная ширина этого изображения составляет 375(iPhone 6), если я написал меньше контента, например 1234ширина изображения равна 40, так как я могу преобразовать содержимое в изображение с нестандартным размером, например, ширина равна 750, а высота равна длине содержимого? Есть идеи? большое спасибо.

1 ответ

Решение

UITextView рендерится только внутри своего текущего кадра, поэтому вам нужно либо изменить размер фрейма до желаемого размера перед рендерингом, либо создать временный объект UITextView для использования в целях рендеринга.

Вот как можно выполнить рендеринг с временным объектом:

// Your call to get the image
    UIImage *image = [self imageFromTextView:self.tvContent width:750.0]; // Any width you want

// Your text view properties that also can be used for rendering purpose
- (void)setupTextViewProperties:(UITextView *)textView {
    textView.font = [UIFont fontWithName:@"Arial" size:16.0f];
    textView.backgroundColor = [UIColor whiteColor];
    textView.textContainerInset = UIEdgeInsetsMake(10, 10, 10, 10);
    textView.contentInset = UIEdgeInsetsMake(0, 0, 10, 0);
    textView.layoutManager.allowsNonContiguousLayout=NO;
}

Настройка временного объекта UITextView, используемого для рендеринга.

- (UIImage *)imageFromTextView:(UITextView *)view width:(CGFloat)desiredWidth {
    // Create a new temporary UITextView to use for rendering
    CGRect frame = CGRectMake(0.0, 0.0, desiredWidth, 0.0);
    UITextView *temporaryTextView = [[UITextView alloc] initWithFrame:frame];

    // Setup the temporary text view
    // You can have different font, colors etc from the original view
    [self setupTextViewProperties:temporaryTextView];
    temporaryTextView.attributedText = view.attributedText;

    // Calculate the height needed for content with width
    CGSize size = CGSizeMake(desiredWidth, 0.0);
    size = [temporaryTextView sizeThatFits:size];

    // Resize the temporary view
    // Note that the calculated size can contain a width smaller that desired with
    temporaryTextView.frame = CGRectMake(0.0, 0.0, desiredWidth, size.height);

    // Get the image
    return [self imageFromView:temporaryTextView];
}

Помощник, который может визуализировать любой вид в виде изображения.

- (UIImage *)imageFromView:(UIView *)view {
    CGSize size = view.bounds.size;
    UIGraphicsBeginImageContextWithOptions(size, YES, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [view.layer renderInContext:context];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}
Другие вопросы по тегам