将UIImageView大小精确地放在一行结束的正下方,并且恰好位于UITextView中一行开始的位置

时间:2014-11-28 03:51:02

标签: ios uiimage uitextview

我想调整UIImageView的大小,使其恰好位于一行结束的位置,并且恰好位于UITextView中一行开头的位置。

情境: 我是使用NSURLConnection从URL下载图像的。然后,我使用ImageIO框架调整图像大小以适应屏幕。最后,我向UITextView.textContainer添加了排除路径,以便文本环绕图像。

问题: 我之前不知道图像的大小,所以我必须调整它以适应。除了图片有时与一条线重叠之外,一切都很有效。

问题: 我如何确保图像的大小,使其恰好适合一行结束的位置和一行开始的正上方?

示例:

Example of problem

正如您在上面的示例中所看到的,图像下方的文字不再显示在行上。我以为我可以从UIImageView和lineHeight的高度得到剩余部分但是,我不知道该怎么做。

前。 (int)imageView.bounds.size.height % (int)self.textView.font.lineHeight

非常感谢任何指导!

P.S。如果我的问题不清楚,请告诉我,我会尝试进一步解释。

1 个答案:

答案 0 :(得分:1)

感谢@CarstenWitzke,我得到了它的工作。我使用了带有NSTextAttachment的NSArributedString。然后,我得到图像高度的剩余部分除以textView.font.lineHeight并从textView.font.lineHeight中减去,然后将差异添加到图像的高度。唯一的问题是调整图像大小以适应新的界限。

<强>实施例

UIImage * scaledImage = [UIImage imageWithCGImage:imageRef scale:2 orientation:UIImageOrientationUp];

NSTextAttachment * textAttachment = [[NSTextAttachment alloc] init];
textAttachment.image = scaledImage;

int remainder = (int)scaledImage.size.height % (int)floor(self.textView.font.lineHeight);
CGFloat difference = (self.textView.font.lineHeight - remainder);

textAttachment.bounds = CGRectMake(0, 0, scaledImage.size.width, scaledImage.size.height + difference);

NSMutableAttributedString * attributedStringWithImage = [[NSAttributedString attributedStringWithAttachment:textAttachment] mutableCopy];

NSAttributedString * newLineAttributedString = [[NSAttributedString alloc] initWithString:@"\n"];

[self.textView.textStorage appendAttributedString:newLineAttributedString];
[self.textView.textStorage appendAttributedString:attributedStringWithImage];
[self.textView.textStorage appendAttributedString:newLineAttributedString];

修改

事实证明我可以使用CoreGraphics框架来填充图像,这样就无需调整图像大小以适应新的界限。

<强>实施例

- (UIImage *)image:(UIImage *)image padding:(CGSize)padding
{
    CGSize size = CGSizeMake(image.size.width + padding.width, image.size.height + padding.height);

    UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIGraphicsPushContext(context);

    CGFloat x = (image.size.width + padding.width) - image.size.width;
    CGFloat y = (image.size.height + padding.height) - image.size.height;
    CGPoint origin = CGPointMake(x, y);
    [image drawAtPoint:origin];

    UIGraphicsPopContext();
    UIImage * paddedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return paddedImage;
}