【问题标题】:Autoresizing NSTextView and it's Font Size自动调整 NSTextView 及其字体大小
【发布时间】:2012-02-21 05:30:11
【问题描述】:
我正在尝试让我的 NSWindow 自动调整大小。我已经调整了我的大部分 UI 项目的大小,但剩下的几个造成问题的对象之一是 NSTextViews:确实,一旦调整了 NSTextView 的大小,我就找不到计算新字体大小的方法。
对于 NSTextFields,我找到了一种根据文本长度查找字体大小的方法。显然,对于多行文本容器似乎没有等效的方法(除非我还没有找到)。
我发现提到的唯一实际地方是这里:http://boutcher.tumblr.com/post/7842216960/nstextview-auto-resizing-text
但是,我无法在我的应用程序中实现此代码,因为似乎存在一个错误,我无法通过创建 NSLayoutManager 的方式来修复。
过去有人这样做过吗?我正在考虑只允许用户将大小调整为只是一个大小,所以我可以硬编码字体大小......处理这些 NSTextViews 真的很痛苦!
【问题讨论】:
标签:
objective-c
cocoa
resize
nstextview
autoresize
【解决方案1】:
请参阅“NSString Application Kit Additions Reference”中的sizeWithAttributes: 方法。
它返回一个 NSSize,您可以将其与 textview 的当前 frame.size 进行比较。
对于“属性”参数,创建一个以 NSFont 作为对象并以 NSFontAttributeName 作为键的 NSDictionary。 (不要被那个常量弄糊涂了。看起来它是字符串的键,但实际上不是;它是字体本身的键。)
从文本视图中获取字符串:[[yourTextView textStorage] string]。
获取您正在使用的字体的 familyName 及其当前的磅值,一个 CGFloat。使用构造函数 [NSFont fontWithName:familyName size:floatChanged] 编写要测试的字体。
一旦你得到正确大小的字体,用它从旧字符串中创建一个新的 NSAttributedString。只需使用您在上面制作的“属性”字典(生成正确大小的字典)并将其提供给 NSAttributedString 的 initWithString:attributes 构造函数。
将该属性字符串分配给 textStorage(它本身是 NSMutableAttributedString 的子类):[[yourTextView textStorage] setAttributedString:thatYouJustMade]。
注意:如果 textview 使用下划线或前/背景色或斜体/粗体等属性,则必须从 textStorage 获取该信息并将其合并到新的属性字符串中。这是可行的。查看 NSAttributedString 和 NSMutableAttributedString 的类引用。