【问题标题】:How to resize and layout image/attachment in TextKit?如何在 TextKit 中调整图像/附件的大小和布局?
【发布时间】:2018-02-06 18:10:55
【问题描述】:

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

当我尝试将图像添加到源 rtfd 文件时,图像附件直接显示在 UITextView 中,无需任何额外代码,太好了!但是,默认情况下会在文本视图框架中剪切一些大图像。我尝试了各种委托方法和覆盖方法来 resizere-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


    【解决方案1】:

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

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

    - (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);
    }
    

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

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2011-01-03
      • 2020-06-15
      相关资源
      最近更新 更多