NSString+hAdd.m 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. //
  2. // NSString+hAdd.m
  3. // MultilevelMenu
  4. //
  5. // Created by Kingson on 2020/12/4.
  6. //
  7. #import "NSString+hAdd.h"
  8. @implementation NSString (hAdd)
  9. - (CGFloat)heightForFont:(UIFont *)font width:(CGFloat)width {
  10. CGSize size = [self sizeForFont:font size:CGSizeMake(width, MAXFLOAT) mode:NSLineBreakByWordWrapping];
  11. return size.height;
  12. }
  13. - (CGSize)sizeForFont:(UIFont *)font size:(CGSize)size mode:(NSLineBreakMode)lineBreakMode {
  14. CGSize result;
  15. if (!font) font = [UIFont systemFontOfSize:12];
  16. if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
  17. NSMutableDictionary *attr = [NSMutableDictionary new];
  18. attr[NSFontAttributeName] = font;
  19. if (lineBreakMode != NSLineBreakByWordWrapping) {
  20. NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
  21. paragraphStyle.lineBreakMode = lineBreakMode;
  22. attr[NSParagraphStyleAttributeName] = paragraphStyle;
  23. }
  24. CGRect rect = [self boundingRectWithSize:size
  25. options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
  26. attributes:attr context:nil];
  27. result = rect.size;
  28. } else {
  29. #pragma clang diagnostic push
  30. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  31. result = [self sizeWithFont:font constrainedToSize:size lineBreakMode:lineBreakMode];
  32. #pragma clang diagnostic pop
  33. }
  34. return result;
  35. }
  36. @end