美文网首页
Text Kit 富文本实现

Text Kit 富文本实现

作者: zbb5335 | 来源:发表于2017-03-22 21:15 被阅读131次

    1. Text Kit基础  

            Text Kit最主要的作用 是为程序提供文字排版和渲染的功能。通过Text Kit可以对文字进行存储、布局,以更加精 的排版方式来显示文本内容。Text Kit属于UIKit框架,其中包 了一些文字排版的相关类和协 。 

            在iOS 7之前没有Text Kit。文本控件,如:UILabel、UITextField和UITextView是基于String Drawing和WebKit构建的。其中String Drawing与Core Graphics接通信。因此在iOS 7之前文本控件也可以实现多种样式的文字排版,但是事实上是通过WebKit实现的。WebKit是一种浏览器内核技术,使用它进行文字渲染会    较多的内存,对应用的性能有一定的  。

          在iOS7之后,UILabel、UITextfField和UITextView构建于TextKit之上,Text Kit是基于Core Text构建的, 通过Core Text与Core Graphics进行交 。

    1.1 Text Kit中的核心类  

    我们在使用Text Kit时,会 及如下核心类。

    1.  `NSTextContainer。定 了文本可以排版的区 。 认情况下是矩形区 ,如果是其它形状的区域,需要通过子类化NSTextContainer来创建。`

    2. `NSLayoutManager。该类负责对文字进行编 排版处理,将存储在NSTextStorage中的数据转换为可以在视图控件中显示的文本内容,并把字编码映射到到对应的字形上,然后将字形排版到NSTextContainer定义的区域中。`

    3. `NSTextStorage。主要用来存储文本的字 和相关属性`

    4. `NSAttributedString。 持渲染不同风格的文本。`

    5. `NSMutableAttributedString。可变类 的NSAttributedString,是NSAttributedString的子类`

    NSLayoutManager对象从NSTextStorage对象中取得文本内容, 进行排版,然后把排版之后的文本放到NSTextContainer对象指定的区 上。最后 由一个文本控件从 NSTextContainer中取出内容显示到屏幕中。

    1.2 凸印效果的实现

    直接上代码

    //创建一个矩形区,这个区是通过CGRectInset函数创建的,这个函数能指定一个中

    //心点,后面的两个参数着self.view.bounds区域向内内进量。这样可以使得文字部分不会太靠近视图的边界。

    CGRecttextViewRect =CGRectInset(self.view.bounds,10.0,20.0);

    //主要用来存储文本的字和相关属性

    NSTextStorage* textStorage = [[NSTextStoragealloc]initWithString:_textView.text];

    //该类负责对文字进行编排版处理,将存储在NSTextStorage中的数据转换为可以在视图控件中显示的文本内容

    NSLayoutManager* layoutManager = [[NSLayoutManageralloc]init];

    [textStorageaddLayoutManager:layoutManager];

    //定义了文本可以排版的区

    _textContainer= [[NSTextContaineralloc]initWithSize:textViewRect.size];

    /**

    *NSLayoutManager对象从NSTextStorage对象中取得文本内容,进行排版,

    *然后把排版之后的文本放到NSTextContainer对象指定的区域上。

    *最后由一个文本控件从NSTextContainer中取出内容显示到屏幕中。

    */

    [layoutManageraddTextContainer:_textContainer];

    [_textViewremoveFromSuperview];

    _textView= [[UITextViewalloc]initWithFrame:textViewRect

    textContainer:_textContainer];

    _textView.textColor= [UIColoryellowColor];

    _textView.editable=NO;

    [self.viewaddSubview:_textView];

    //设置凸印效果

    [textStoragebeginEditing];

    NSDictionary*attrsDic =@{NSTextEffectAttributeName:NSTextEffectLetterpressStyle};

    NSMutableAttributedString*attrStr = [[NSMutableAttributedStringalloc]

    initWithString:_textView.text

    attributes:attrsDic];

    [textStoragesetAttributedString:attrStr];

    [self markWord:@"you"inTextStorage:textStorage];

    [self markWord:@"I"inTextStorage:textStorage];

    [self markWord:@"言"inTextStorage:textStorage];

    [textStorageend Editing];

    标识制定文字

    - (void) markWord:(NSString*)word inTextStorage:(NSTextStorage*)textStorage{

    NSRegularExpression*regex = [NSRegularExpressionregularExpressionWithPattern:word

    options:0

    error:nil];

    NSArray*matches = [regexmatchesInString:_textView.text

    options:0

    range:NSMakeRange(0,[_textView.textlength])];

    for(NSTextCheckingResult*matchinmatches) {

    NSRangematchRange = [matchrange];

    [textStorageaddAttribute:NSForegroundColorAttributeName

    value:[UIColorredColor]

    range:matchRange];

    }

    效果图:

    富文本

    1.3 图文混排

    Text Kit通过环绕路径(exclusion paths)将文字按照指定的路径环绕在图片等视图对象的周围

    // 在上面代码基础上,添加一个UIImageView

    // 指定NSTextContainer环绕路径实现图文混排

    //设置环绕路径,可以指定多个

    _textView.textContainer.exclusionPaths=@[[selftranslatedBezierPath]];

    取得UIImageView的贝塞尔曲线

    -(UIBezierPath*) translatedBezierPath{

    //将imageView相对于View的坐标转换为相对于textView的坐标

    CGRectimageRect = [self.textViewconvertRect:_imageView.frame

    fromView:self.view];

    UIBezierPath*newPath = [UIBezierPathbezierPathWithRect:imageRect];

    return newPath;

    }

    效果图

    图文混排

    1.4 动态字体

    注册UIContentSizeCategoryDidChangeNotification通知,实现动态字体功能

    [[NSNotificationCenterdefaultCenter]addObserver:self

    selector:@selector(preferredContentSizeChanged:)

    name:UIContentSizeCategoryDidChangeNotification

    object:nil];

    #pragma mark --监听字体变化

    - (void)preferredContentSizeChanged:(NSNotification*)notification{

    // do something

    }

    图文混排cpu、memory使用非常高,怎么优化?

    demo地址

    相关文章

      网友评论

          本文标题:Text Kit 富文本实现

          本文链接:https://www.haomeiwen.com/subject/rrdanttx.html