CT 图文混排

图文混排

     CTFrameRef  textFrame     // coreText 的 frame

     CTLineRef      line             //  coreText 的 line

     CTRunRef      run             //  line  中的部分文字

     相关方法:

   CFArrayRef CTFrameGetLines    (CTFrameRef frame )      //获取包含CTLineRef的数组

   void CTFrameGetLineOrigins(
   CTFrameRef frame,
   CFRange range,
   CGPoint origins[] )  //获取所有CTLineRef的原点

 CFRange CTLineGetStringRange  (CTLineRef line )    //获取line中文字在整段文字中的Range

 CFArrayRef CTLineGetGlyphRuns  (CTLineRef line )    //获取line中包含所有run的数组

 CFRange CTRunGetStringRange  (CTRunRef run )     //获取run在整段文字中的Range

 CFIndex CTLineGetStringIndexForPosition(
   CTLineRef line,
   CGPoint position )   //获取点击处position文字在整段文字中的index

   CGFloat CTLineGetOffsetForStringIndex(
   CTLineRef line,
   CFIndex charIndex,
   CGFloat* secondaryOffset ) //获取整段文字中charIndex位置的字符相对line的原点的x值

  主要步骤:

       1)计算并存储文字中保含的所有表情文字及其Range

       2)替换表情文字为指定宽度的NSAttributedString

           CTRunDelegateCallbacks callbacks;
   callbacks.version = kCTRunDelegateVersion1;
   callbacks.getAscent = ascentCallback;
   callbacks.getDescent = descentCallback;
   callbacks.getWidth = widthCallback;
   callbacks.dealloc = deallocCallback;
   
   CTRunDelegateRef runDelegate = CTRunDelegateCreate(&callbacks, NULL);
   NSDictionary *attrDictionaryDelegate = [NSDictionary dictionaryWithObjectsAndKeys:
                                           (id)runDelegate, (NSString*)kCTRunDelegateAttributeName,
                                           [UIColor clearColor].CGColor,(NSString*)kCTForegroundColorAttributeName,
                                           nil];
   
   NSAttributedString *faceAttributedString = [[NSAttributedString alloc] initWithString:@"*" attributes:attrDictionaryDelegate];
   
   [weiBoText replaceCharactersInRange:faceRange withAttributedString:faceAttributedString];
   [faceAttributedString release];    

       3)  根据保存的表情文字的Range计算表情图片的Frame

                textFrame 通过CTFrameGetLines 获取所有line的数组 lineArray

               遍历lineArray中的line通过CTLineGetGlyphRuns获取line中包含run的数组 runArray

               遍历runArray中的run 通过CTRunGetStringRange获取run的Range

               判断表情文字的location是否在run的Range

               如果在 通过CTLineGetOffsetForStringIndex获取x的值 y的值为line原点的值

       4)Draw表情图片到计算获取到的Frame

(3)点击文字触发事件

   主要步骤:

       1) 根据touch事件获取点point

       2)   textFrame 通过CTFrameGetLineOrigins获取所有line的原点

       3) 比较point和line原点的y值获取点击处于哪个line

       4)  line、point 通过CTLineGetStringIndexForPosition获取到点击字符在整段文字中的    index   

       5)  NSAttributedString 通过index 用方法-(NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range  可以获取到点击到的NSAttributedString中存储的NSDictionary

       6) 通过NSDictionary中存储的信息判断点击的哪种文字类型分别处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值