【发布时间】:2018-02-06 18:10:55
【问题描述】:
我正在通过 TextKit 构建一个杂志应用程序,这是一个 TextKit demo(查看 developer 分支)。它从 rtfd 文件中加载一个 NSAttributeString 作为文本存储对象,所有页面与自定义 NSTextContainer 对象大小相同,分页功能完成。
当我尝试将图像添加到源 rtfd 文件时,图像附件直接显示在 UITextView 中,无需任何额外代码,太好了!但是,默认情况下会在文本视图框架中剪切一些大图像。我尝试了各种委托方法和覆盖方法来 resize 和 re-layout 但最后都失败了。
- (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;
}
此委托方法可以调整布局大小,但不会影响最终宽度和图像比例。我尝试了薮猫解决方案,但没有运气。似乎关于 SO 和苹果示例代码 TextKit 上的图像的线程并不多。
请帮忙,非常感谢!
【问题讨论】:
标签: ios objective-c image layout textkit