最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

IOS 圖文混排(CoreText.framework)詳解及實例

 更新時間:2016年11月21日 14:40:17   作者:邊緣998  
這篇文章主要介紹了IOS 圖文混排(CoreText.framework)詳解及實例的相關(guān)資料,這里對IOS 的圖文混排進行了詳細介紹,并附代碼實例,和實現(xiàn)效果圖,需要的朋友可以參考下

IOS 圖文混排(CoreText.framework)

       本文主要介紹了IOS圖文混排的資料,這里整理了在網(wǎng)上查找的內(nèi)容,幫助理解,掌握這部分知識,以下就是整理的內(nèi)容:   

利用CORETEXT進行圖文混排。

實現(xiàn)代碼:

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; 
} 

先設(shè)置一個CTRun的委托,主要是用于指定對象的上行高,寬,或上下文釋放時使用。

-(void)drawCharAndPicture 
{ 
  CGContextRef context = UIGraphicsGetCurrentContext(); 
   
  CGContextSetTextMatrix(context, CGAffineTransformIdentity);//設(shè)置字形變換矩陣為CGAffineTransformIdentity,也就是說每一個字形都不做圖形變換 
   
  CGAffineTransform flipVertical = CGAffineTransformMake(1,0,0,-1,0,self.bounds.size.height); 
  CGContextConcatCTM(context, flipVertical);//將當(dāng)前context的坐標(biāo)系進行flip 
  NSLog(@"bh=%f",self.bounds.size.height); 
   
  NSMutableAttributedString *attributedString = [[[NSMutableAttributedString alloc] initWithString:@"請在這里插入一張圖片位置"] autorelease]; 
   
   
  //為圖片設(shè)置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); 
} 

效果:


從上面看大家可能沒有發(fā)現(xiàn)什么問題,當(dāng)把圖片放在字的最左邊會是什么樣子的?


因此為了避免這種情況發(fā)生,我在代碼中添加了換行模式。添加換行后的效果:


感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

最新評論

永昌县| 海城市| 淮阳县| 锡林郭勒盟| 武城县| 文化| 洛宁县| 壤塘县| 绥棱县| 漳州市| 淅川县| 永靖县| 鸡东县| 璧山县| 化隆| 怀宁县| 龙门县| 泗洪县| 平山县| 潞城市| 定边县| 图木舒克市| 儋州市| 周宁县| 会宁县| 来宾市| 盱眙县| 顺平县| 黔江区| 博客| 乌鲁木齐县| 南澳县| 文安县| 丰宁| 丽江市| 夹江县| 呼和浩特市| 中卫市| 越西县| 安福县| 锦屏县|