String+BoundingRect.swift 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. //
  2. // String+BoundingRect.swift
  3. // SwiftBilibili
  4. //
  5. // Created by 罗文 on 2021/1/13.
  6. // Copyright © 2021年 罗文. All rights reserved.
  7. //
  8. import UIKit
  9. extension String {
  10. func boundingRect(with size: CGSize, attributes: [NSAttributedString.Key: Any]) -> CGRect {
  11. let options: NSStringDrawingOptions = [.usesLineFragmentOrigin, .usesFontLeading]
  12. let rect = self.boundingRect(with: size, options: options, attributes: attributes, context: nil)
  13. return snap(rect)
  14. }
  15. func size(thatFits size: CGSize, font: UIFont, maximumNumberOfLines: Int = 0) -> CGSize {
  16. let attributes: [NSAttributedString.Key: Any] = [.font: font]
  17. var size = self.boundingRect(with: size, attributes: attributes).size
  18. if maximumNumberOfLines > 0 {
  19. size.height = min(size.height, CGFloat(maximumNumberOfLines) * font.lineHeight)
  20. }
  21. return size
  22. }
  23. func width(with font: UIFont, maximumNumberOfLines: Int = 0) -> CGFloat {
  24. let size = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
  25. return self.size(thatFits: size, font: font, maximumNumberOfLines: maximumNumberOfLines).width
  26. }
  27. func height(thatFitsWidth width: CGFloat, font: UIFont, maximumNumberOfLines: Int = 0) -> CGFloat {
  28. let size = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)
  29. return self.size(thatFits: size, font: font, maximumNumberOfLines: maximumNumberOfLines).height
  30. }
  31. }