【问题标题】:NSTextView not drawing text onto NSImageNSTextView 没有在 NSImage 上绘制文本
【发布时间】:2016-01-11 21:49:49
【问题描述】:

我正在尝试在 NSImage 上绘制一些文本,但遇到了一些问题。
最初我只是在 NSImage 上绘制一个属性字符串,但如果字符串太长,它会从图像中消失,我找不到将文本换行的方法。

为了解决这个问题,我想我可以制作一个 NSTextView,将文本放入其中,然后将其绘制到 NSImage 上。

不幸的是,当我尝试将 NSTextView 绘制到 NSImage 时,文本没有出现。 NSTextView 的背景颜色确实出现了。

当我在将焦点锁定在 NSImage 之前设置断点并预览 NSTextView 时,文本视图有文本。在我将文本视图绘制到 NSImage 上之后,看起来 NSTextView 被绘制了,只是没有文本。

如果有更好的方法将文本扔到具有多行能力的 NSImage 上,请告诉我如何。

这是我写的代码供参考:

NSTextView *textToDraw = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, input.size.width - 16, 243)];
textToDraw.backgroundColor = [NSColor blueColor];
[textToDraw setAlignment:NSTextAlignmentCenter];
[textToDraw setEditable:YES];
// textOnImage is a regular NSString  
[textToDraw insertText:textOnImage replacementRange:NSMakeRange(0, textOnImage.length)];
[textToDraw setTextColor:[NSColor blackColor]];
[textToDraw setFont:font];
[textToDraw setEditable:NO];

// input is an NSImage
[input lockFocus];
[textToDraw drawRect:NSMakeRect(8, inputImage.size.height - textToDraw.frame.size.height - 8, textToDraw.frame.size.width, textToDraw.frame.size.height)];
[input unlockFocus];

【问题讨论】:

  • @johnelemans 这个问题虽然相似,但不是我的重复,也没有回答我的问题。
  • 我不认为你可以像那样调用 textview 的 drawRect 方法。在绘制此类对象之前,其父视图通常会完成许多图形上下文设置。为什么不把textview加到imageview的superview中,覆盖图片,然后让app触发绘图?
  • 对不起我的上一篇文章。为了使事情变得更复杂,我只是将您的代码复制到我的一个应用程序中,它工作正常。文本完全按照应有的方式绘制在图像上。
  • @johnelemans 感谢您的回复。我之所以调用 drawRect 仅仅是因为这是我在其他地方搜索时看到它的方式,我通常是一名 iOS 开发人员,我通常不会乱画东西。有趣的是它对你有用。即使清理项目并重置我的计算机,我也无法让它工作。我最终只是将 NSTextView 的位图图像表示绘制到一个新的 NSImage,然后将新图像绘制到原始图像上。它看起来很乱,但就我的目的而言,它会正常工作。谢谢。

标签: objective-c macos cocoa nstextview nsimage


【解决方案1】:

您可以提供应在其中绘制文本的有界矩形,而不是在图像上绘制文本视图。如果字符串太长,它不会跑出图像,并会自动换行。

这是代码,其中inputImage 是您要在其上绘制文本的图像

NSImage *newImage = [[NSImage alloc] initWithSize:inputImage.size];  
[newImage lockFocus];  
[inputImage drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];  
[textStr drawInRect:boundedRect withAttributes:attrsDictionary];  
[newImage unlockFocus];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2018-04-02
    • 2020-08-20
    • 1970-01-01
    • 2020-08-02
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多