CoreText的簡(jiǎn)單使用(三)

基于前面文章<a >《CoreText的簡(jiǎn)單使用(二)》</a>的介紹舀射,我們基于CoreText封裝了一個(gè)簡(jiǎn)單的文本排版框架代咸,但是它有很大的局限性,因?yàn)槲覀兤綍r(shí)開(kāi)發(fā)的時(shí)候套媚,如果需要文本排版,很大可能性就是需要一段文本中展示不同樣式磁椒,可能有多種字體、顏色玫芦、大小等浆熔。所以基于之前的框架基礎(chǔ)上再次進(jìn)行修改。

定制排版文件格式

我們首先想到對(duì)KGCTFrameParser進(jìn)行修改桥帆,因?yàn)槲覀兪褂肬ILabel加載富文本的時(shí)候医增,就是使用NSAttributeString來(lái)實(shí)現(xiàn)文本變色、字體大小變化等老虫。所以我們修改KGCTFrameParser類(lèi)的方法叶骨,使用NSAttributeString作為參數(shù)。

修改后KGCTFrameParser類(lèi)代碼如下:

#import <Foundation/Foundation.h>
#import "KGCoreTextData.h"
#import "KGCTFrameParserConfig.h"


NS_ASSUME_NONNULL_BEGIN

@interface KGCTFrameParser : NSObject

+ (KGCoreTextData *)parseContent:(NSAttributedString *)content config:(KGCTFrameParserConfig *)config;

+ (NSDictionary *)attributesWithConfig:(KGCTFrameParserConfig *)config;

@end

NS_ASSUME_NONNULL_END

#import "KGCTFrameParser.h"

@implementation KGCTFrameParser

+ (NSDictionary *)attributesWithConfig:(KGCTFrameParserConfig *)config{
    CGFloat fontSize = config.fontSize;
    CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"ArialMT", fontSize, NULL);
    CGFloat lineSpacing = config.lineSpace;
    const CFIndex kNumberOfSettings = 3;
    CTParagraphStyleSetting theSettings[kNumberOfSettings] = {
        {kCTParagraphStyleSpecifierLineSpacingAdjustment,sizeof(CGFloat),&lineSpacing},
        {kCTParagraphStyleSpecifierMaximumLineSpacing,sizeof(CGFloat),&lineSpacing},
        {kCTParagraphStyleSpecifierMinimumLineSpacing,sizeof(CGFloat),&lineSpacing}
    };
    CTParagraphStyleRef theParagraphRef = CTParagraphStyleCreate(theSettings, kNumberOfSettings);
    
    UIColor *textColor = config.textColor;
    
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    dict[NSForegroundColorAttributeName] = (id)textColor.CGColor;
    dict[NSFontAttributeName] = (__bridge id)fontRef;
    dict[NSParagraphStyleAttributeName] = (__bridge id)theParagraphRef;
    
    CFRelease(theParagraphRef);
    CFRelease(fontRef);
    return dict;
}

+ (KGCoreTextData *)parseContent:(NSAttributedString *)content config:(KGCTFrameParserConfig *)config{
    //創(chuàng)建CTFramesetterRef實(shí)例
    CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)content);
    //獲得要繪制的區(qū)域的高度
    CGSize restrictSize = CGSizeMake(config.width, CGFLOAT_MAX);
    CGSize coreTextSize = CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, CFRangeMake(0, 0), nil, restrictSize, nil);
    CGFloat textHeight = coreTextSize.height;
    
    //生成CTFrameRef實(shí)例
    CTFrameRef frame = [self createFrameWithFrameSetter:frameSetter config:config height:textHeight];
    
    //將生成好的CTFrameRef實(shí)例和計(jì)算好的繪制高度保存到CoreTextData實(shí)例中祈匙,最后返回實(shí)例
    KGCoreTextData *data = [[KGCoreTextData alloc] init];
    data.ctFrame = frame;
    data.height = textHeight;
    CFRelease(frame);
    CFRelease(frameSetter);
    return data;
}

+ (CTFrameRef)createFrameWithFrameSetter:(CTFramesetterRef)frameSetter config:(KGCTFrameParserConfig *)config height:(CGFloat)height{
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, CGRectMake(0, 0, config.width, height));
    CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
    CFRelease(path);
    return frame;
}

@end

然后在KGCoreTextCtrl中進(jìn)行配置忽刽,代碼如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    KGCTFrameParserConfig *config = [[KGCTFrameParserConfig alloc] init];
    config.textColor = [UIColor blackColor];
    config.width = self.ctView.width;
    
    NSString *str = @"這是一個(gè)測(cè)試代碼天揖,主要是為了展示富文本,前面一句話(huà)顯示紅色跪帝,第二句話(huà)顯示綠色今膊,三句話(huà)字體放大";
    NSDictionary *attr = [KGCTFrameParser attributesWithConfig:config];
    
    NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:str attributes:attr];

    [attributeString addAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]} range:NSMakeRange(0, 9)];
    [attributeString addAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]} range:NSMakeRange(10, 10)];
    [attributeString addAttributes:@{NSForegroundColorAttributeName:[UIColor blueColor],NSFontAttributeName:KGFont(20.0)} range:NSMakeRange(21, 10)];
    
    KGCoreTextData *data = [KGCTFrameParser parseContent:attributeString config:config];
    
    self.ctView.data = data;
    self.ctView.height = data.height;
    self.ctView.backgroundColor = [UIColor yellowColor];
}

- (KGDisPlayView *)ctView{
    if (!_ctView) {
        self.ctView = [[KGDisPlayView alloc] initWithFrame:CGRectMake(50, 100, self.view.frame.size.width - 100, 300)];
        [self.view addSubview:self.ctView];
    }
    return _ctView;
}

最后運(yùn)行項(xiàng)目,查看效果伞剑,如下圖所示:

20200810003.png

但是在實(shí)際開(kāi)發(fā)的時(shí)候斑唬,不會(huì)只是簡(jiǎn)簡(jiǎn)單單顯示這種,而且前后端數(shù)據(jù)交互啥的黎泣,我們拿到是這種的數(shù)據(jù)的話(huà)恕刘,處理起來(lái)很麻煩,所以一般都是和后臺(tái)進(jìn)行約定抒倚,規(guī)定一種格式褐着,方便前端進(jìn)行使用,最常見(jiàn)的就是JSON格式直接返回排版需要的配置衡便,例如:

[
    {
        "color":"red",
        "size":"12",
        "content":"但是在實(shí)際開(kāi)發(fā)的時(shí)候献起,不會(huì)只是簡(jiǎn)簡(jiǎn)單單顯示這種,而且前后端數(shù)據(jù)交互啥的",
        "type":"txt"
    },
    {
        "color":"green",
        "size":"16",
        "content":"我們拿到是這種的數(shù)據(jù)的話(huà)镣陕,處理起來(lái)很麻煩谴餐,所以一般都是和后臺(tái)進(jìn)行約定",
        "type":"txt"
    },
    {
        "color":"blue",
        "size":"20",
        "content":"規(guī)定一種格式,方便前端進(jìn)行使用呆抑,最常見(jiàn)的就是JSON格式直接返回排版需要的配置",
        "type":"txt"
    }
]

我以前做一個(gè)類(lèi)似微博廣場(chǎng)功能塊的圖文混排時(shí)候岂嗓,后臺(tái)返回的就是這種數(shù)據(jù)類(lèi)型,當(dāng)我們得到這樣的JSON數(shù)據(jù)后鹊碍,我們可以使用優(yōu)秀的三方庫(kù)進(jìn)行數(shù)據(jù)解析JSONKit厌殉,也可以通過(guò)系統(tǒng)提供的NSJSONSerialization進(jìn)行解析,得到NSDictionary對(duì)象的數(shù)據(jù)組后侈咕,通過(guò)以下一系類(lèi)方法進(jìn)行轉(zhuǎn)換得到我們繪制需要的數(shù)據(jù)公罕。

首先我們需要將接受到的JSON數(shù)據(jù)進(jìn)行解析,然后讀取JSON數(shù)據(jù)返回的配置以及內(nèi)容耀销,得到一個(gè)富文本楼眷,然后根據(jù)富文本去生成繪制模型,具體代碼如下:

#pragma mark --根據(jù)JSON數(shù)據(jù)熊尉,創(chuàng)建富文本

+ (NSDictionary *)attributesWithConfig:(KGCTFrameParserConfig *)config{
    CGFloat fontSize = config.fontSize;
    CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"ArialMT", fontSize, NULL);
    CGFloat lineSpacing = config.lineSpace;
    const CFIndex kNumberOfSettings = 3;
    CTParagraphStyleSetting theSettings[kNumberOfSettings] = {
        {kCTParagraphStyleSpecifierLineSpacingAdjustment,sizeof(CGFloat),&lineSpacing},
        {kCTParagraphStyleSpecifierMaximumLineSpacing,sizeof(CGFloat),&lineSpacing},
        {kCTParagraphStyleSpecifierMinimumLineSpacing,sizeof(CGFloat),&lineSpacing}
    };
    CTParagraphStyleRef theParagraphRef = CTParagraphStyleCreate(theSettings, kNumberOfSettings);
    
    UIColor *textColor = config.textColor;
    
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    dict[NSForegroundColorAttributeName] = (id)textColor.CGColor;
    dict[NSFontAttributeName] = (__bridge id)fontRef;
    dict[NSParagraphStyleAttributeName] = (__bridge id)theParagraphRef;
    
    CFRelease(theParagraphRef);
    CFRelease(fontRef);

    return dict;
}

+ (CTFrameRef)createFrameWithFrameSetter:(CTFramesetterRef)frameSetter config:(KGCTFrameParserConfig *)config height:(CGFloat)height{
    //創(chuàng)建一個(gè)可變路徑罐柳,圖形上下文中要繪制的圖形或線條的數(shù)學(xué)描述
    CGMutablePathRef path = CGPathCreateMutable();
    //追加矩形到可變路徑
    CGPathAddRect(path, NULL, CGRectMake(0, 0, config.width, height));
    //對(duì)核心文本框架對(duì)象的引用
    CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
    CFRelease(path);
    return frame;
}

+ (UIColor *)colorFromDictionary:(NSDictionary *)dict{
    if ([dict[@"color"] isEqualToString:@"red"]) {
        return [UIColor redColor];
    } else if ([dict[@"color"] isEqualToString:@"blue"]) {
        return [UIColor blueColor];
    } else if ([dict[@"color"] isEqualToString:@"green"]) {
        return [UIColor greenColor];
    }else{
        return nil;
    }
}

+ (NSAttributedString *)attributedingWithDictionary:(NSDictionary *)dic config:(KGCTFrameParserConfig *)config{
    //創(chuàng)建一個(gè)可變字典,保存默認(rèn)富文本信息配置選項(xiàng)
    NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[self attributesWithConfig:config]];
    //獲取數(shù)據(jù)中顏色值
    UIColor *color = [self colorFromDictionary:dic];
    if (color) {
        //如果數(shù)據(jù)中給出顏色值狰住,替換默認(rèn)設(shè)置的色值
        attributes[NSForegroundColorAttributeName] = color;
    }
    CGFloat fontSize = [dic[@"size"] floatValue];
    if (fontSize > 0) {
        //獲取數(shù)據(jù)返回的字體大小张吉,如果存在,創(chuàng)建一個(gè)CTFontRef實(shí)例催植,替換默認(rèn)設(shè)置項(xiàng)中的字體設(shè)置
        CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"ArialMT", fontSize, NULL);
        attributes[NSFontAttributeName] = (__bridge id)fontRef;
        //釋放CTFontRef實(shí)例
        CFRelease(fontRef);
    }
    NSString *content = dic[@"content"];
    //根據(jù)富文本培訓(xùn)選項(xiàng)以及給定字符串創(chuàng)建并返回一個(gè)富文本
    return [[NSAttributedString alloc] initWithString:content attributes:attributes];
}

+ (NSAttributedString *)loadJSONContent:(NSString *)jsonContent config:(KGCTFrameParserConfig *)config{
    //JSON字符串轉(zhuǎn)NSData
    NSData *data = [jsonContent dataUsingEncoding:NSUTF8StringEncoding];
    //創(chuàng)建一個(gè)可變富文本肮蛹,保存JSON數(shù)據(jù)
    NSMutableAttributedString *result = [[NSMutableAttributedString alloc] init];
    //這里做下容錯(cuò)處理勺择,如果傳入的json數(shù)據(jù)是非空并且有內(nèi)容,進(jìn)行數(shù)據(jù)轉(zhuǎn)換
    if (data) {
        //因?yàn)镴SON數(shù)據(jù)本身最外層就是一個(gè)數(shù)組蔗崎,所以這塊需要用數(shù)組去接受JSON解析后得到的值
        NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        //這里再做下容錯(cuò)處理酵幕,如果是NSArray類(lèi),那就說(shuō)明數(shù)據(jù)沒(méi)有問(wèn)題缓苛,可以進(jìn)行下一步操作
        if ([arr isKindOfClass:[NSArray class]]) {
            //直接使用for in遍歷
            for (NSDictionary *dict in arr) {
                NSString *type = dict[@"type"];
                //判斷type類(lèi)型是否是txt芳撒,因?yàn)楝F(xiàn)在只是對(duì)txt類(lèi)型進(jìn)行的處理,所以這塊需要進(jìn)行過(guò)濾
                if ([type isEqualToString:@"txt"]) {
                    //獲取到單條數(shù)據(jù)富文本信息
                    NSAttributedString *as = [self attributedingWithDictionary:dict config:config];
                    //將單條數(shù)據(jù)富文本信息拼接到總數(shù)據(jù)中
                    [result appendAttributedString:as];
                }
            }
        }
    }
    return result;
}

+ (KGCoreTextData *)parseJSONContent:(NSString *)jsonContent config:(KGCTFrameParserConfig *)config{
    //通過(guò)JSON數(shù)據(jù)未桥,得到富文本
    NSAttributedString *content = [self loadJSONContent:jsonContent config:config];
    //創(chuàng)建CTFramesetterRef實(shí)例
    CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)content);
    //設(shè)置繪制邊界大小
    CGSize restrictSize = CGSizeMake(config.width, CGFLOAT_MAX);
    //獲得實(shí)際繪制所需要的大小
    CGSize coreTextSize = CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, CFRangeMake(0, 0), nil, restrictSize, nil);
    //因?yàn)閷挾纫呀?jīng)國(guó)定笔刹,所以在這獲取實(shí)際繪制需要的高度
    CGFloat textHeight = coreTextSize.height;
    //生成CTFrameRef實(shí)例
    CTFrameRef frame = [self createFrameWithFrameSetter:frameSetter config:config height:textHeight];
    //將生成好的CTFrameRef實(shí)例和計(jì)算好的繪制高度保存到CoreTextData實(shí)例中,最后返回實(shí)例
    KGCoreTextData *data = [[KGCoreTextData alloc] init];
    //設(shè)置實(shí)際繪制需要的實(shí)例對(duì)象
    data.ctFrame = frame;
    //設(shè)置實(shí)際繪制需要的高度
    data.height = textHeight;
    //因?yàn)榈讓訋?kù)不受ARC約束冬耿,所以需要手動(dòng)調(diào)用CFRelease來(lái)進(jìn)行釋放
    //釋放生成的CTFrameRef實(shí)例
    CFRelease(frame);
    //釋放CTFramesetterRef實(shí)例
    CFRelease(frameSetter);
    //返回需要的繪制數(shù)據(jù)模型
    return data;
}

方法里面的注釋寫(xiě)的很清晰舌菜,所以不做多的介紹。我們?cè)贙GDisPlayView內(nèi)部的設(shè)置還是不變亦镶,只需要在ViewController中對(duì)KGCTFrameParser進(jìn)行配置日月,代碼如下:

#import "KGCoreTextCtrl.h"
#import "KGDisPlayView.h"
#import "KGCTFrameParserConfig.h"
#import "KGCoreTextData.h"
#import "KGCTFrameParser.h"
#import <CoreText/CoreText.h>

@interface KGCoreTextCtrl ()

@property (nonatomic, strong) KGDisPlayView *ctView;

@end

@implementation KGCoreTextCtrl

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    KGCTFrameParserConfig *config = [[KGCTFrameParserConfig alloc] init];
    config.textColor = [UIColor blackColor];
    config.width = self.ctView.width;
    
    NSArray *arr = @[
    @{
        @"type":@"txt",
        @"content":@"但是在實(shí)際開(kāi)發(fā)的時(shí)候,不會(huì)只是簡(jiǎn)簡(jiǎn)單單顯示這種缤骨,而且前后端數(shù)據(jù)交互啥的爱咬,",
        @"size":@"12",
        @"color":@"red"
    },
    @{
        @"type":@"txt",
        @"content":@"我們拿到是這種的數(shù)據(jù)的話(huà),處理起來(lái)很麻煩绊起,所以一般都是和后臺(tái)進(jìn)行約定精拟,",
        @"size":@"16",
        @"color":@"green"
    },
    @{
        @"type":@"txt",
        @"content":@"規(guī)定一種格式,方便前端進(jìn)行使用虱歪,最常見(jiàn)的就是JSON格式直接返回排版需要的配置",
        @"size":@"20",
        @"color":@"blue"
    }
    ];
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingFragmentsAllowed error:nil];
    KGCoreTextData *data = [KGCTFrameParser parseJSONContent:[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding] config:config];
    
    self.ctView.data = data;
    self.ctView.height = data.height;
    self.ctView.backgroundColor = [UIColor yellowColor];
}

- (KGDisPlayView *)ctView{
    if (!_ctView) {
        self.ctView = [[KGDisPlayView alloc] initWithFrame:CGRectMake(50, 100, self.view.frame.size.width - 100, 300)];
        [self.view addSubview:self.ctView];
    }
    return _ctView;
}


@end

最后得到的效果如下圖所示:

20200811001.png

到此我們的框架可以支持富文本格式的文本渲染了蜂绎,下一篇,開(kāi)始探索圖文混排笋鄙。

系列文章:

<a >《CoreText的簡(jiǎn)單使用(一)》</a>

<a >《CoreText的簡(jiǎn)單使用(二)》</a>

<a >《CoreText的簡(jiǎn)單使用(三)》</a>

<a >《CoreText的簡(jiǎn)單使用(四)》</a>

<a >《CoreText的簡(jiǎn)單使用(五)》</a>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末师枣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子萧落,更是在濱河造成了極大的恐慌坛吁,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铐尚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哆姻,警方通過(guò)查閱死者的電腦和手機(jī)宣增,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)矛缨,“玉大人爹脾,你說(shuō)我怎么就攤上這事帖旨。” “怎么了灵妨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵解阅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我泌霍,道長(zhǎng)货抄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任朱转,我火速辦了婚禮蟹地,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藤为。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布魂莫。 她就那樣靜靜地躺著淮菠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪存淫。 梳的紋絲不亂的頭發(fā)上耘斩,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音纫雁,去河邊找鬼煌往。 笑死,一個(gè)胖子當(dāng)著我的面吹牛轧邪,可吹牛的內(nèi)容都是我干的刽脖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼忌愚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼曲管!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起硕糊,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤院水,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后简十,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體檬某,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年螟蝙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恢恼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胰默,死狀恐怖场斑,靈堂內(nèi)的尸體忽然破棺而出漓踢,到底是詐尸還是另有隱情,我是刑警寧澤漏隐,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布喧半,位于F島的核電站,受9級(jí)特大地震影響青责,放射性物質(zhì)發(fā)生泄漏挺据。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一爽柒、第九天 我趴在偏房一處隱蔽的房頂上張望吴菠。 院中可真熱鬧,春花似錦浩村、人聲如沸做葵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酿矢。三九已至,卻和暖如春怎燥,著一層夾襖步出監(jiān)牢的瞬間瘫筐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工铐姚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留策肝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓隐绵,卻偏偏與公主長(zhǎng)得像之众,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子依许,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • CoreText的簡(jiǎn)單使用(一) 介紹: 讀唐巧的《iOS開(kāi)發(fā)進(jìn)階》棺禾,關(guān)于CoreText的筆記。借用介紹:“使用...
    KG丿夏沫閱讀 1,097評(píng)論 0 0
  • 基于上一篇 《CoreText的簡(jiǎn)單使用(一)》 的介紹峭跳,我們?cè)俅翁剿飨卤焐簦吘箤?duì)于我們開(kāi)發(fā)來(lái)說(shuō),功能代碼都是需要能...
    KG丿夏沫閱讀 242評(píng)論 0 0
  • 目錄 1.解釋self = [super init]方法 容錯(cuò)處理,當(dāng)父類(lèi)初始化失敗,會(huì)返回一個(gè)nil,表示初始化...
    勇敢的_心_閱讀 1,393評(píng)論 0 4
  • CoreText是iOS/OSX中文本顯示的一個(gè)底層框架蛀醉,它是用C語(yǔ)言寫(xiě)成的悬襟,有快速簡(jiǎn)單的優(yōu)勢(shì)。iOS中的Text...
    小貓仔閱讀 4,974評(píng)論 2 9
  • 閑來(lái)無(wú)事想著自己搞個(gè)富文本的工具庫(kù)拯刁,不至于每次遇見(jiàn)這些東西就用別人的第三方古胆。自己研究研究也有助于自己對(duì)這方面的理解...
    傲骨天成科技閱讀 2,431評(píng)論 4 9