如何在UITextView中显示图像,如Mail,并使其保持居中

时间:2014-05-23 06:59:08

标签: ios objective-c uiimageview uiimage uitextview

在Mail中,可以阅读电子邮件,该电子邮件是文本段落,后跟占据整个宽度的图像,后跟更多文本。我想在我的应用程序(只读文本视图)中执行完全相同的操作,除了我想限制它不填充整个宽度但始终保持在屏幕中心(即使在旋转后)。我已经编写了一个解决方案,但我不确定如何使图像居中,或者可能采用比我所做的更清洁/更好的方法。

我在UIImage通过UITextView的文字末尾添加了NSMutableAttributedString。我首先必须调整图像的大小,为此,我使用共享的UIImage类别来调整图像大小,不会降低图像质量(非常糟糕),并保持纵横比。< / p>

    NSMutableAttributedString *mutableAttString = [[NSMutableAttributedString alloc] initWithString:self.textView.text];
    UIImage *image = [UIImage imageNamed:@"myImage"];

    CGSize newSize = CGSizeMake(self.textView.frame.size.width, self.textView.frame.size.height);

    //resize image to fit scren width using category
    image = [image resizedImageWithContentMode:UIViewContentModeScaleAspectFit bounds:newSize interpolationQuality:kCGInterpolationHigh];

    NSTextAttachment *textAttachment = [NSTextAttachment new];
    textAttachment.image = image;
    textAttachment.bounds = CGRectMake(0,-5, image.size.width, image.size.height);
    NSAttributedString *attributedString = [NSAttributedString attributedStringWithAttachment:textAttachment];

    [mutableAttString insertAttributedString:attributedString atIndex:(self.textView.text.length)];

    self.textView.attributedText = mutableAttString;

我不喜欢这个解决方案,因为图像不在屏幕上居中,如果我可以在旋转到景观和从景观旋转时再次调整图像比例,那将是很好的。目前,它的大小始终相同。而且我不想使用这个类别。 :)

我想要采用的另一种方法是根本不将图像添加到textView,而是找到一些方法根据内容动态调整textView的高度,然后在UIImageView下面添加textView {1}}并使用“自动布局”使其水平居中。这不是最灵活的解决方案,但这是我的布局 - 文字段落下面有图像,没有别的,所以我愿意这样做。

我只是想知道,Apple是如何为Mail做的?你有什么建议?

enter image description here

2 个答案:

答案 0 :(得分:1)

1.您可以使用属性字符串将附件保留在textview中。一旦插入,只需设置附件的框架。

或2.您可以使用包含动态单元格的表格视图,其中包含图像和文本,并根据单元格内容设置其高度。

答案 1 :(得分:1)

我实施了一个解决方案,其中一些文字位于图像上方。它不像Mail那样灵活,但它适用于我的情况。

我在一个部分创建了一个带有一个静态自定义单元格的UITableViewController。在该单元格中,UITextView设置了自动布局,始终是单元格的大小。然后我拖入桌子下方的UIImageView并将其模式设置为Aspect Fit并输入图像名称。在heightForCellAtIndexPath:中,我通过在textView上调用sizeToFit然后return self.cellTextView.frame.size.height;来计算拟合所有文本所需的高度。当然,我调整了单元格背景颜色并摆脱了分隔符线条,所以你不能在桌子上告诉它。

这很好,因为图像保持居中并始终位于文本下方,整个视图可滚动。幸运的是,在旋转设备时heightForCellAtIndexPath:被调用,所以它始终是正确的高度。如果您想在文本下方添加额外的填充,只需将其添加到计算的UITextView高度。