CocoaExtension // +NSAttributedString.boundingDimension.

This commit is contained in:
ShikiSuen 2023-02-17 19:53:57 +08:00
parent 74ccd6d0b7
commit 7d4e7ae551
1 changed files with 32 additions and 2 deletions

View File

@ -9,9 +9,39 @@
import Cocoa
import SwiftExtension
// MARK: - NSMutableString extension
// MARK: - NSSize extension
public extension NSMutableString {
public extension NSSize {
static var infinity: NSSize { .init(width: Double.infinity, height: Double.infinity) }
}
// MARK: - NSAttributedString extension
// Ref: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html
public extension NSAttributedString {
@objc var boundingDimension: NSSize {
let rectA = boundingRect(
with: NSSize(width: Double.infinity, height: Double.infinity),
options: [.usesLineFragmentOrigin]
)
let textStorage = NSTextStorage(attributedString: self)
let textContainer = NSTextContainer()
let layoutManager = NSLayoutManager()
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)
textContainer.lineFragmentPadding = 0.0
layoutManager.glyphRange(for: textContainer)
let rectB = layoutManager.usedRect(for: textContainer)
let width = ceil(max(rectA.width, rectB.width))
let height = ceil(max(rectA.height, rectB.height))
return .init(width: width, height: height)
}
}
// MARK: - NSString extension
public extension NSString {
var localized: String { NSLocalizedString(description, comment: "") }
}