更改NSTextField字体大小以适应

11

有没有像UILabel的adjustsFontSizeToFitWidth这样的东西可以用于NSTextField?


这个回答解决了你的问题吗?获取 NSTextField 内容并进行缩放 - Jon Schneider
3个回答

2

Swift 4 解决方案:

它会逐个调整大小,直到符合要求,或者最小字体大小为3。

    let minimumFontSize = 3

    var sizeNotOkay = true
    var attempt = 0

    while sizeNotOkay || attempt < 15 { // will try 15 times maximun
        let expansionRect = textField.expansionFrame(withFrame: textField.frame)

        let truncated = !NSEqualRects(NSRect.zero, expansionRect)

        if truncated {
            if let actualFontSize : CGFloat = textField.font?.fontDescriptor.object(forKey: NSFontDescriptor.AttributeName.size) as? CGFloat {
                textField.font = NSFont.systemFont(ofSize: actualFontSize - 1)

                if actualFontSize < minimumFontSize {
                    break
                }
            }
        } else {
            sizeNotOkay = false
        }

        attempt += 1
    }

2
简而言之:不行。您必须进行一些蛮力工作,才能确定给定字体大小(设置为NSFontAttributeName的NSFont)的字符串的-sizeWithAttributes: -boundingRectWithSize:options:attributes:
我建议从标准系统字体大小开始,然后根据所需矩形是较小还是较大,向下或向上调整大小。

2023 WWDC 前的更新:若能在 macOS 中使用 iOS 的动态文本,那将会非常美妙。系统可以比个别应用开发者更好地优化此功能。 - Joshua Nozzi

0

我想出了自己的解决方案(并不是一个好的解决方案!只是以防万一有人找不到更好的解决方案)

extension NSTextField {
    func fontSizeToFit() {
        if stringValue.count > 90 {
            font = NSFont.systemFont(ofSize: 40)
        } else {
            font = NSFont.systemFont(ofSize: CGFloat(120 - stringValue.count))
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接