https://github.com/YouXianMing

ParagraphString - 段落样式的简易处理

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

 

posted @ 2016-11-16 17:18  YouXianMing  阅读(1171)  评论(0编辑  收藏  举报