IOS 图文混排(CoreText.framework)详解及实例_IOS

IOS 图文混排(CoreText.framework)

       本文主要介绍了IOS图文混排的资料,这里整理了在网上查找的内容,帮助理解,掌握这部分知识,以下就是整理的内容:   

利用CORETEXT进行图文混排。

实现代码:

void RunDelegateDeallocCallback( void* refCon ){ 

} 

CGFloat RunDelegateGetAscentCallback( void *refCon ){
  NSString *imageName = (NSString *)refCon;
  return 80;//[UIImage imageNamed:imageName].size.height;
} 

CGFloat RunDelegateGetDescentCallback(void *refCon){
  return 0;
} 

CGFloat RunDelegateGetWidthCallback(void *refCon){
  NSString *imageName = (NSString *)refCon;
  return 100;//[UIImage imageNamed:imageName].size.width;
} 

先设置一个CTRun的委托,主要是用于指定对象的上行高,宽,或上下文释放时使用。

-(void)drawCharAndPicture
{
  CGContextRef context = UIGraphicsGetCurrentContext(); 

  CGContextSetTextMatrix(context, CGAffineTransformIdentity);//设置字形变换矩阵为CGAffineTransformIdentity,也就是说每一个字形都不做图形变换 

  CGAffineTransform flipVertical = CGAffineTransformMake(1,0,0,-1,0,self.bounds.size.height);
  CGContextConcatCTM(context, flipVertical);//将当前context的坐标系进行flip
  NSLog(@"bh=%f",self.bounds.size.height); 

  NSMutableAttributedString *attributedString = [[[NSMutableAttributedString alloc] initWithString:@"请在这里插入一张图片位置"] autorelease]; 

  //为图片设置CTRunDelegate,delegate决定留给图片的空间大小
  NSString *imgName = @"img.png";
  CTRunDelegateCallbacks imageCallbacks;
  imageCallbacks.version = kCTRunDelegateVersion1;
  imageCallbacks.dealloc = RunDelegateDeallocCallback;
  imageCallbacks.getAscent = RunDelegateGetAscentCallback;
  imageCallbacks.getDescent = RunDelegateGetDescentCallback;
  imageCallbacks.getWidth = RunDelegateGetWidthCallback;
  CTRunDelegateRef runDelegate = CTRunDelegateCreate(&imageCallbacks, imgName);
  NSMutableAttributedString *imageAttributedString = [[NSMutableAttributedString alloc] initWithString:@" "];//空格用于给图片留位置
  [imageAttributedString addAttribute:(NSString *)kCTRunDelegateAttributeName value:(id)runDelegate range:NSMakeRange(0, 1)];
  CFRelease(runDelegate); 

  [imageAttributedString addAttribute:@"imageName" value:imgName range:NSMakeRange(0, 1)]; 

  [attributedString insertAttributedString:imageAttributedString atIndex:4]; 
 //换行模式
  CTParagraphStyleSetting lineBreakMode;
  CTLineBreakMode lineBreak = kCTLineBreakByCharWrapping;
  lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;
  lineBreakMode.value = &lineBreak;
  lineBreakMode.valueSize = sizeof(CTLineBreakMode); 

  CTParagraphStyleSetting settings[] = {
    lineBreakMode
  }; 

  CTParagraphStyleRef style = CTParagraphStyleCreate(settings, 1); 

  // build attributes
  NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)style forKey:(id)kCTParagraphStyleAttributeName ]; 

  // set attributes to attributed string
  [attributedString addAttributes:attributes range:NSMakeRange(0, [attributedString length])]; 

  CTFramesetterRef ctFramesetter = CTFramesetterCreateWithAttributedString((CFMutableAttributedStringRef)attributedString); 

  CGMutablePathRef path = CGPathCreateMutable();
  CGRect bounds = CGRectMake(0.0, 0.0, self.bounds.size.width, self.bounds.size.height);
  CGPathAddRect(path, NULL, bounds); 

  CTFrameRef ctFrame = CTFramesetterCreateFrame(ctFramesetter,CFRangeMake(0, 0), path, NULL);
  CTFrameDraw(ctFrame, context); 

  CFArrayRef lines = CTFrameGetLines(ctFrame);
  CGPoint lineOrigins[CFArrayGetCount(lines)];
  CTFrameGetLineOrigins(ctFrame, CFRangeMake(0, 0), lineOrigins);
  NSLog(@"line count = %ld",CFArrayGetCount(lines));
  for (int i = 0; i < CFArrayGetCount(lines); i++) {
    CTLineRef line = CFArrayGetValueAtIndex(lines, i);
    CGFloat lineAscent;
    CGFloat lineDescent;
    CGFloat lineLeading;
    CTLineGetTypographicBounds(line, &lineAscent, &lineDescent, &lineLeading);
    NSLog(@"ascent = %f,descent = %f,leading = %f",lineAscent,lineDescent,lineLeading); 

    CFArrayRef runs = CTLineGetGlyphRuns(line);
    NSLog(@"run count = %ld",CFArrayGetCount(runs));
    for (int j = 0; j < CFArrayGetCount(runs); j++) {
      CGFloat runAscent;
      CGFloat runDescent;
      CGPoint lineOrigin = lineOrigins[i];
      CTRunRef run = CFArrayGetValueAtIndex(runs, j);
      NSDictionary* attributes = (NSDictionary*)CTRunGetAttributes(run);
      CGRect runRect;
      runRect.size.width = CTRunGetTypographicBounds(run, CFRangeMake(0,0), &runAscent, &runDescent, NULL);
      NSLog(@"width = %f",runRect.size.width); 

      runRect=CGRectMake(lineOrigin.x + CTLineGetOffsetForStringIndex(line, CTRunGetStringRange(run).location, NULL), lineOrigin.y - runDescent, runRect.size.width, runAscent + runDescent); 

      NSString *imageName = [attributes objectForKey:@"imageName"];
      //图片渲染逻辑
      if (imageName) {
        UIImage *image = [UIImage imageNamed:imageName];
        if (image) {
          CGRect imageDrawRect;
          imageDrawRect.size = image.size;
          imageDrawRect.origin.x = runRect.origin.x + lineOrigin.x;
          imageDrawRect.origin.y = lineOrigin.y;
          CGContextDrawImage(context, imageDrawRect, image.CGImage);
        }
      }
    }
  } 

  CFRelease(ctFrame);
  CFRelease(path);
  CFRelease(ctFramesetter);
} 

效果:

从上面看大家可能没有发现什么问题,当把图片放在字的最左边会是什么样子的?

因此为了避免这种情况发生,我在代码中添加了换行模式。添加换行后的效果:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ios
, 图文混排
, 图文混排实例
CoreText.framework
coretext 图文混排、word2010图文混排实例、word图文混排实例、ios coretext图文混排、html图文混排实例,以便于您获取更多的相关知识。

时间: 2024-10-28 21:48:00

IOS 图文混排(CoreText.framework)详解及实例_IOS的相关文章

ios. 图文混排后,如何输出带有格式的信息呢

问题描述 ios. 图文混排后,如何输出带有格式的信息呢 客户端需要能够在编辑文本过程中插入图片,将带有格式信息上传服务器,这样才能在下次获取时,保持原有格式,谁来告诉我怎么做呢 解决方案 参考代码http://code4app.com/ios/解析HTML/5167ca396803faf447000002 不知道是否能帮到你, 其实我也很想知道这方面的技术,一起研究探讨吧 解决方案二: coretext解决

IOS React Native FlexBox详解及实例_IOS

IOS React Native FlexBox详解及资料整理, # 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所偏差,在学习中如果有错会及时修改内容,也欢迎万能的朋友们批评指出,谢谢 文章第一版出自简书,如果出现图片或页面显示问题,烦请转至 简书 查看 也希望喜欢的朋友可以点赞,谢谢 什么是 FlexBox 布局 在 html 中,界面的搭建都是采用 C

ios 图文混排的消息怎么实现?可以给个例子吗?

问题描述 就是消息的文字下面有个可点击的按钮部分,求解? 解决方案 实现思路:自定义的将图片,username以及自己想要显示的其他内容(通过扩展属性message.ext)一块显示到UI上.移动客服的Demo有这部分的相关实现,可以参考下,下载网址:http://docs.easemob.com/doku.p ... guide

iOS给图片添加滤镜&amp;使用openGLES动态渲染图片详解及实例_IOS

iOS给图片添加滤镜&使用openGLES动态渲染图片 给图片增加滤镜有这两种方式: CoreImage / openGLES  下面先说明如何使用CoreImage给图片添加滤镜, 主要为以下步骤: #1.导入CIImage格式的原始图片 #2.创建CIFilter滤镜 #3.用CIContext将滤镜中的图片渲染出来 #4.导出渲染后的图片 参考代码: //导入CIImage CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage

ios 环信图文混排的怎么做的呢? 大神给个例子可以么?

问题描述 解决方案 自定义bubbleview去展示就可以了,图文混排的.

ios-iOS如何实现图文混排?

问题描述 iOS如何实现图文混排? 请问我想实现这样的效果需要怎么做,是用什么空间?具体代码是甚么?如果有demo万分感激,iOS菜鸟新人求指点. 解决方案 http://www.bokee.net/company/weblog_viewEntry/14467602.html 解决方案二: 估计你要用textView,而且还有个库处理排版.叫做TextView.framework貌似 解决方案三: iOS实现图文混排效果ios CoreText实现图文混排和点击事件ios聊天窗口 图文混排---

Android中使用TextView实现图文混排的方法_Android

向TextView或EditText中添加图像比直接添加文本复杂一点点,需要用到<img>标签. <img>只有一个src属性,该属性原则上应该指向一个图像地址或可以找到某个图像资源的唯一标识.但要注意的是,系统并不会直接根据src属性所指的值自动获取和显示图像,这一切都需要我们去做.说白了,src属性指的是什么只有开发者自己知道.开发者需要告诉系统src属性到底指的是什么,然后系统才会知道怎么做. 解析src属性值需要ImageGetter对象的getDrawable方法来完成.

Android 仿淘宝、京东商品详情页向上拖动查看图文详情控件DEMO详解_Android

一.淘宝商品详情页效果 我们的效果 二.实现思路      使用两个scrollView,两个scrollView 竖直排列,通过自定义viewGroup来控制两个scrollView的竖直排列,以及滑动事件的处理.如下图 三.具体实现 1.继承viewGroup自定义布局View 重写onMeasure()和onLayout方法,在onLayout方法中完成对两个子ScrollView的竖直排列布局,代码如下: 布局文件: <RelativeLayout xmlns:android="h

折角式精典的网页图文混排

图文混排的效果不错,和大家分享.以下是HTML网页特效代码,点击运行按钮可查看效果: [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]