【发布时间】: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