之前做小说阅读器时,计算每页展示的字符串.
先导入CoreText.framework
NSAttributedString+ReaderPage
@interface NSAttributedString (ReaderPage)
// 根据渲染图文大小分页,返回range数组,数组count表示共多少页
- (NSArray *)pageRangeArrayWithConstrainedToSize:(CGSize)size;
@end
#import "NSAttributedString+ReaderPage.h"
#import <CoreText/CoreText.h>
@implementation NSAttributedString (ReaderPage)
// 根据指定的大小,对字符串进行分页,计算出每页显示的字符串区间(NSRange)
- (NSArray *)pageRangeArrayWithConstrainedToSize:(CGSize)size {
NSAttributedString *attributedString = self;
NSMutableArray * resultRange = [NSMutableArray array];
CGRect rect = CGRectMake(0, 0, size.width, size.height);
NSInteger rangeIndex = 0;
do {
NSUInteger length = MIN(1500, attributedString.length - rangeIndex);
NSAttributedString * childString = [attributedString attributedSubstringFromRange:NSMakeRange(rangeIndex, length)];
CTFramesetterRef childFramesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) childString);
UIBezierPath * bezierPath = [UIBezierPath bezierPathWithRect:rect];
CTFrameRef frame = CTFramesetterCreateFrame(childFramesetter, CFRangeMake(0, 0), bezierPath.CGPath, NULL);
CFRange range = CTFrameGetVisibleStringRange(frame);
NSRange r = {rangeIndex, range.length};
if (r.length > 0) {
[resultRange addObject:[NSValue valueWithRange:r]];
}
if (r.length == 0) {
rangeIndex ++;
} else {
rangeIndex += r.length;
}
CFRelease(frame);
CFRelease(childFramesetter);
} while (rangeIndex < attributedString.length && attributedString.length > 0);
return resultRange;
}
@end