【问题标题】: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 的类引用。

    【讨论】:

    • 我决定换一种方式,但您的解决方案非常精确!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多