ParagraphString - 段落样式的简易处理
效果
源码
https://github.com/YouXianMing/UI-Component-Collection 中的 ParagraphString
// // ParagraphString.h // RichString // // Created by YouXianMing on 2016/11/11. // Copyright © 2016年 TechCode. All rights reserved. // #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import "BaseParagraphStyle.h" @interface ParagraphString : NSObject /** The input string. */ @property (nonatomic, strong) NSString *string; /** Set the string's font, default is nil. */ @property (nonatomic, strong) UIFont *font; /** Set the string's textColor, default is nil. */ @property (nonatomic, strong) UIColor *textColor; /** Set the paragraph style, default is nil. */ @property (nonatomic, strong) BaseParagraphStyle *paragraphStyle; /** Make the config (Font, textColor, paragraphStyle) effective. */ - (void)makeConfigEffective; /** The attributedString, before you get this, you should set property and run makeConfigEffective first. */ @property (nonatomic, strong, readonly) NSMutableAttributedString *attributedString; /** The string's height with the fixed width. @param width The specified width. @return The string's height. */ - (CGFloat)heightWithFixedWidth:(CGFloat)width; /** The string's height with the fixed width. @param lines The number of lines. @param width The specified width. @return The string's height. */ - (CGFloat)numberOfLines:(NSInteger)lines fixedWidth:(CGFloat)width; /** ParagraphString's constructor. @param string The string. @param font The font. @param color The color. @param style The paragraph style. @return The ParagraphString's instance. */ + (instancetype)paragraphStringWithString:(NSString *)string font:(UIFont *)font color:(UIColor *)color paragraphStyle:(BaseParagraphStyle *)style; @end
// // ParagraphString.m // RichString // // Created by YouXianMing on 2016/11/11. // Copyright © 2016年 TechCode. All rights reserved. // #import "ParagraphString.h" @interface ParagraphString () @property (nonatomic, strong) NSMutableAttributedString *attributedString; @end @implementation ParagraphString - (void)makeConfigEffective { if (self.string) { NSRange range = NSMakeRange(0, self.string.length); NSMutableAttributedString *richString = [[NSMutableAttributedString alloc] initWithString:self.string]; self.font ? [richString addAttribute:NSFontAttributeName value:self.font range:range] : 0; self.textColor ? [richString addAttribute:NSForegroundColorAttributeName value:self.textColor range:range] : 0; self.paragraphStyle ? [richString addAttribute:NSParagraphStyleAttributeName value:self.paragraphStyle range:range] : 0; self.attributedString = richString; } else { self.attributedString = nil; } } + (instancetype)paragraphStringWithString:(NSString *)string font:(UIFont *)font color:(UIColor *)color paragraphStyle:(BaseParagraphStyle *)style { ParagraphString *paragraphString = [[[self class] alloc] init]; paragraphString.string = string; paragraphString.font = font; paragraphString.textColor = color; paragraphString.paragraphStyle = style; [paragraphString makeConfigEffective]; return paragraphString; } - (CGFloat)heightWithFixedWidth:(CGFloat)width { CGFloat height = 0; if (self.attributedString) { CGRect rect = [self.attributedString boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingTruncatesLastVisibleLine |NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil]; height = rect.size.height; } return height; } - (CGFloat)numberOfLines:(NSInteger)lines fixedWidth:(CGFloat)width { NSRange range = NSMakeRange(0, self.string.length); NSMutableAttributedString *richString = [[NSMutableAttributedString alloc] initWithString:self.string]; self.font ? [richString addAttribute:NSFontAttributeName value:self.font range:range] : 0; self.textColor ? [richString addAttribute:NSForegroundColorAttributeName value:self.textColor range:range] : 0; self.paragraphStyle ? [richString addAttribute:NSParagraphStyleAttributeName value:self.paragraphStyle range:range] : 0; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 0)]; label.numberOfLines = lines; label.attributedText = richString; [label sizeToFit]; return label.frame.size.height; } @end
// // BaseParagraphStyle.h // RichString // // Created by YouXianMing on 2016/11/11. // Copyright © 2016年 TechCode. All rights reserved. // #import <UIKit/UIKit.h> @interface BaseParagraphStyle : NSMutableParagraphStyle @end
// // BaseParagraphStyle.m // RichString // // Created by YouXianMing on 2016/11/11. // Copyright © 2016年 TechCode. All rights reserved. // #import "BaseParagraphStyle.h" @implementation BaseParagraphStyle @end