gpt4 book ai didi

ios - 如何在 TextKit 中调整图像/附件的大小和布局?

转载 作者:行者123 更新时间:2023-11-29 00:12:51 25 4
gpt4 key购买 nike

我正在通过 TextKit 构建一个杂志应用程序,这里是一个 TextKit demo (查看 developer 分支)。它从 rtfd 文件中加载一个 NSAttributeString 作为文本存储对象,所有页面都具有与自定义 NSTextContainer 对象相同的大小,完成分页功能。

当我尝试将图像添加到源 rtfd 文件时,图像附件直接显示在 UITextView 中,无需任何额外代码,这太棒了!但是,默认情况下,一些大图像将在 TextView 框架中被裁剪。我尝试了各种委托(delegate)方法和覆盖方法来调整重新布局,但最后都失败了。

 - (void)setAttachmentSize:(CGSize)attachmentSize forGlyphRange:(NSRange)glyphRange
- (CGSize)attachmentSizeForGlyphAtIndex:(NSUInteger)glyphIndex;

setter 方法在字形布局过程中调用,后者的getter 方法在字形绘制过程中从调用堆栈中调用。

- (BOOL)layoutManager:(NSLayoutManager *)layoutManager shouldSetLineFragmentRect:(inout CGRect *)lineFragmentRect lineFragmentUsedRect:(inout CGRect *)lineFragmentUsedRect baselineOffset:(inout CGFloat *)baselineOffset inTextContainer:(NSTextContainer *)textContainer forGlyphRange:(NSRange)glyphRange 
{

NSTextAttachment *attachment = ...;

NSUInteger characterIndex = [layoutManager characterIndexForGlyphAtIndex:glyphRange.location];
UIImage *image = [attachment imageForBounds:*lineFragmentRect textContainer:textContainer characterIndex:characterIndex];
CGSize imageSize = GetScaledToFitSize(image.size, self.textContainerSize);

CGFloat ratio = imageSize.width / imageSize.height;
CGRect rect = *lineFragmentRect, usedRect = *lineFragmentUsedRect;

CGFloat dy = *baselineOffset - imageSize.height;

if (dy > 0) {
*baselineOffset -= dy;
usedRect.size.height -= dy;
usedRect.size.width = ratio * usedRect.size.height;
}

if (!CGRectContainsRect(usedRect, rect)) {
if (rect.size.height > usedRect.size.height) {
*baselineOffset -= rect.size.height - usedRect.size.height;
rect.size.height = usedRect.size.height;
rect.size.width = ratio * usedRect.size.height;
}

if (rect.size.width > usedRect.size.width) {
//...
}
}

*lineFragmentRect = rect;
*lineFragmentUsedRect = usedRect;

return YES;
}

此委托(delegate)方法可以调整布局大小但不影响最终宽度和图像比例。我尝试了几种解决方案但没有运气。似乎在 SO 和 Apple 示例代码上关于 TextKit 上的图像的线程并不多。

最佳答案

我曾经为图像附件自动调整大小做过类似的工作。获取属性字符串后立即处理如何?

即用NSAttachmentAttributeName枚举原始字符串,用NSTextAttachment的子类替换附件,隐含NSTextAttachmentContainer协议(protocol)。

- (CGRect)attachmentBoundsForTextContainer:(nullable NSTextContainer *)textContainer proposedLineFragment:(CGRect)lineFrag glyphPosition:(CGPoint)position characterIndex:(NSUInteger)charIndex {
CGFloat lineWidth = CGRectGetWidth(lineFrag);
CGSize size = self.bounds.size;
size.height *= (size.width > 0) ? (lineWidth / size.width) : 0;
size.width = lineWidth;
return CGRectMake(0, 0, size.width, size.height);
}

上面的代码调整附件大小以适应宽度,您不需要调整图像大小,因为绘图时它会自动调整大小到边界。

希望对您有所帮助。

关于ios - 如何在 TextKit 中调整图像/附件的大小和布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45936519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com