在 MacOS 应用程序的 NSTextFieldCell (Swift 3) 中自动调整文本大小
Autosizing text in NSTextFieldCell (Swift 3) for MacOS App
我的问题: 我正在 Swift 3 中构建一个 MacOS 应用程序,并希望在 [=11] 中自动调整文本大小(更改字体大小) =],这样文本在其容器中始终可见。
我遇到过 Get NSTextField contents to scale,但不确定如何在我的应用程序中将其应用到 Swift 3。有没有人对如何实现我的目标有任何建议或解释(甚至 link)?
我创建了一个 return NSFont 对象的函数:
func calculateFont(toFit textField: NSTextField, withString string: NSString, minSize min: Int, maxSize max: Int) -> NSFont {
for i in min...max {
var attr: [String: Any] = [:] as Dictionary
attr[NSFontSizeAttribute] = NSFont(name: textField.font!.fontName, size: CGFloat(i))!
let strSize = string.size(withAttributes: [NSFontAttributeName: NSFont.systemFont(ofSize: CGFloat(i))])
let linesNumber = Int(textField.bounds.height/strSize.height)
if strSize.width/CGFloat(linesNumber) > textField.bounds.width {
return (i == min ? NSFont(name: "\(textField.font!.fontName)", size: CGFloat(min)) : NSFont(name: "\(textField.font!.fontName)", size: CGFloat(i-1)))!
}
}
return NSFont(name: "\(textField.font!.fontName)", size: CGFloat(max))!
}
你可以这样使用它:
// set multines
self.textField.lineBreakMode = .byWordWrapping // this looks like it doesn't work, set it in the storyboard instead
self.textField.maximumNumberOfLines = 100
// set font
self.textField.font = self.calculateFont(toFit: self.textField, withString: self.textField.stringValue as NSString, minSize: 8, maxSize: 50)
告诉我这是否适合你
我的问题: 我正在 Swift 3 中构建一个 MacOS 应用程序,并希望在 [=11] 中自动调整文本大小(更改字体大小) =],这样文本在其容器中始终可见。
我遇到过 Get NSTextField contents to scale,但不确定如何在我的应用程序中将其应用到 Swift 3。有没有人对如何实现我的目标有任何建议或解释(甚至 link)?
我创建了一个 return NSFont 对象的函数:
func calculateFont(toFit textField: NSTextField, withString string: NSString, minSize min: Int, maxSize max: Int) -> NSFont {
for i in min...max {
var attr: [String: Any] = [:] as Dictionary
attr[NSFontSizeAttribute] = NSFont(name: textField.font!.fontName, size: CGFloat(i))!
let strSize = string.size(withAttributes: [NSFontAttributeName: NSFont.systemFont(ofSize: CGFloat(i))])
let linesNumber = Int(textField.bounds.height/strSize.height)
if strSize.width/CGFloat(linesNumber) > textField.bounds.width {
return (i == min ? NSFont(name: "\(textField.font!.fontName)", size: CGFloat(min)) : NSFont(name: "\(textField.font!.fontName)", size: CGFloat(i-1)))!
}
}
return NSFont(name: "\(textField.font!.fontName)", size: CGFloat(max))!
}
你可以这样使用它:
// set multines
self.textField.lineBreakMode = .byWordWrapping // this looks like it doesn't work, set it in the storyboard instead
self.textField.maximumNumberOfLines = 100
// set font
self.textField.font = self.calculateFont(toFit: self.textField, withString: self.textField.stringValue as NSString, minSize: 8, maxSize: 50)
告诉我这是否适合你