iOS精选iOS Developer首页投稿(暂停使用,暂停投稿)

YYText 源码解析 —— YYLabel (一)

2016-08-12  本文已影响2493人  sim_cai

架构


(引用作者框架对比图片)

YYText包括控件(YYLabel,YYTextView),布局(YYTextLayout,NSAttributedString,YYTextContainer),核心(CoreText)。

源码目录组织

YYLabel

继承关系


YYLabel 直接继承 UIView,作者自己实现 Label 的渲染。+_+

state

struct {
            
// 是否需要更新布局
unsigned int layoutNeedUpdate : 1;
unsigned int showingHighlight : 1;

unsigned int trackingTouch : 1;
unsigned int swallowTouch : 1;
unsigned int touchMoved : 1;

unsigned int hasTapAction : 1;
unsigned int hasLongPressAction : 1;

// 内容是否支持逐渐消失
unsigned int contentsNeedFade : 1;
    } _state;

如何熏染出 Text

YYLabel 的熏染是通过 YYTextAsyncLayerDelegate 完成。 YYTextAsyncLayerDelegate 提供了 newAsyncDisplayTask 配置方法用来实现渲染。

YYTextAsyncLayer 与 YYLabel 的熏染流程

setText 为例,看看这个熏染的流程。

熏染

本人对 Core Graphics Framework 部分不同熟悉,个人重点对这一块代码进行学。刚才我们发现这里的渲染分为:普通渲染(ps:不知道怎么称,叫同步渲染感觉不太适合,就叫普通渲染吧)和异步渲染。这两种渲染的渲染代码处理基本是一样的,只是异步熏染增加了一些多线程的处理的考虑(比如:多线程经典的“读与写”的问题)。

所以就直接学习普通渲染部分的代码吧#^_^#

YYTextAsyncLayer 熏染学习

UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, self.contentsScale);
CGContextRef context = UIGraphicsGetCurrentContext();

if (self.opaque) {
    CGSize size = self.bounds.size;
    size.width *= self.contentsScale;
    size.height *= self.contentsScale;
    CGContextSaveGState(context); {
        if (!self.backgroundColor || CGColorGetAlpha(self.backgroundColor) < 1) {
            CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
            CGContextAddRect(context, CGRectMake(0, 0, size.width, size.height));
            CGContextFillPath(context);
        }
        if (self.backgroundColor) {
            CGContextSetFillColorWithColor(context, self.backgroundColor);
            CGContextAddRect(context, CGRectMake(0, 0, size.width, size.height));
            CGContextFillPath(context);
        }
    } CGContextRestoreGState(context);
}

task.display(context, self.bounds.size, ^{return NO;});
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.contents = (__bridge id)(image.CGImage);
上一篇下一篇

猜你喜欢

热点阅读