遇到的问题
在一个自适应高度的自定义cell中,使用了多行UILabel,造成了TableView滑动掉帧。
解决办法:CoreText替代UI控件进行绘制,还能处理图文混排
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
// 获取当前上下文
CGContextRef context = UIGraphicsGetCurrentContext();
// 翻转坐标系
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
// 绘制路径
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, self.bounds);
// 创建绘制的字符串和CTFrame
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:self.text];
NSDictionary *attributes = @{NSFontAttributeName:self.font, NSForegroundColorAttributeName:self.textColor};
[attString addAttributes:attributes range:NSMakeRange(0, attString.length)];
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attString);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, [attString length]), path, NULL);
// 绘制
CTFrameDraw(frame, context);
// 释放内存
CFRelease(frame);
CFRelease(path);
CFRelease(framesetter);
}
参考链接链接
# iOS:基于CoreText的排版引擎
网友评论