亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

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

2020-07-26 03:04:49
字體:
來源:轉載
供稿:網友

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

效果:


從上面看大家可能沒有發現什么問題,當把圖片放在字的最左邊會是什么樣子的?


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


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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美电影在线免费观看网站| 亚洲综合日韩中文字幕v在线| 欧美最猛性xxxxx(亚洲精品)| 亚洲一区二区三区四区在线播放| 狠狠躁夜夜躁人人爽天天天天97| 91在线|亚洲| 久久久久亚洲精品| 国产视频精品一区二区三区| 国产做受高潮69| 久久久av网站| 福利微拍一区二区| 欧美激情xxxx性bbbb| 久久久爽爽爽美女图片| 久久亚洲影音av资源网| 精品在线小视频| 青青久久av北条麻妃海外网| 欧美区二区三区| 久久天天躁夜夜躁狠狠躁2022| 午夜精品一区二区三区在线播放| 一区二区三区回区在观看免费视频| 国产精品户外野外| 中文字幕国产日韩| 欧美日韩成人在线视频| 亲爱的老师9免费观看全集电视剧| 成人日韩在线电影| 91性高湖久久久久久久久_久久99| 91精品国产综合久久久久久久久| 久久久精品2019中文字幕神马| 日韩欧美999| 欧美美最猛性xxxxxx| 精品中文视频在线| 欧美丰满少妇xxxxx| 精品久久久久久久久久久久久| 欧美精品在线播放| 美女扒开尿口让男人操亚洲视频网站| 欧美一区二区三区免费观看| 色综合天天综合网国产成人网| 最近2019中文字幕第三页视频| 91国在线精品国内播放| 色综合五月天导航| 久久精品欧美视频| 亚洲精品99久久久久中文字幕| 亚洲激情视频网站| 亚洲天堂免费视频| 国产成人精品av在线| 91亚洲国产精品| 午夜精品久久久久久99热软件| 国产中文字幕日韩| 亚洲欧美日韩成人| 欧美激情一区二区久久久| 久久久久久午夜| 国产美女久久久| 国产精品自拍视频| 久久精品国产欧美亚洲人人爽| 国产啪精品视频| 欧美日韩高清区| 91美女福利视频高清| 亚洲的天堂在线中文字幕| 国产精品麻豆va在线播放| 亚洲欧美日韩精品久久奇米色影视| 国产精品一区二区3区| 欧美野外猛男的大粗鳮| 欧美激情精品久久久久久| 色偷偷偷综合中文字幕;dd| 国产精品一区二区三区久久久| 日韩中文字幕不卡视频| 久久久久久国产三级电影| 久久久91精品国产一区不卡| 欧美在线一区二区三区四| 日本欧美黄网站| 亚洲国产精彩中文乱码av在线播放| 不卡av在线播放| 国产又爽又黄的激情精品视频| 欧美最猛性xxxxx免费| 亚洲一区二区三区四区视频| 欧美激情精品久久久久久大尺度| 欧美电影免费观看高清完整| 亚洲性xxxx| 国产噜噜噜噜久久久久久久久| 日韩av最新在线观看| 欧美视频在线观看 亚洲欧| 国产成人精品一区| 欧美多人爱爱视频网站| 日韩最新免费不卡| 欧美电影免费看| 欧美丝袜美女中出在线| 中文字幕国产亚洲2019| 国产日韩在线视频| 欧美精品手机在线| 国产精品999999| 精品欧美一区二区三区| 久久久久久久av| 免费成人高清视频| 色婷婷成人综合| 一区二区三区国产在线观看| 91夜夜揉人人捏人人添红杏| 欧美夫妻性视频| 成人女保姆的销魂服务| 国产精品自拍偷拍| 欧美激情精品久久久久久免费印度| 国产日韩欧美影视| 国产欧美日韩丝袜精品一区| 欧美日韩爱爱视频| 国产精品久久久久久久久久久久| 国产www精品| 日本免费在线精品| 国产精品久久久久不卡| 欧美在线视频免费观看| 久久精品在线视频| 欧美黑人极品猛少妇色xxxxx| 日韩视频免费大全中文字幕| 日韩在线视频免费观看| 成人观看高清在线观看免费| 一区二区三区精品99久久| 亚洲欧美日韩久久久久久| 97视频com| 国产精品九九九| 亚洲精品综合久久中文字幕| 欧美电影在线观看完整版| 6080yy精品一区二区三区| 国产性猛交xxxx免费看久久| 日韩网站免费观看高清| 国产精品精品久久久| 精品国产网站地址| 26uuu亚洲伊人春色| 日韩高清电影免费观看完整版| 亚洲日本中文字幕免费在线不卡| 日韩精品亚洲元码| 日韩av最新在线观看| 日韩一区二区福利| 欧美最猛性xxxxx亚洲精品| 久久综合免费视频影院| 国产精品av电影| 亚洲第一男人av| 国产精品成人一区| 国产精品青草久久久久福利99| 热门国产精品亚洲第一区在线| 欧美日韩成人在线观看| 午夜精品在线观看| 亚洲久久久久久久久久| 久久久久久久影视| 中文国产成人精品| 亚洲欧美国产精品va在线观看| 亚洲人在线视频| 这里只有视频精品| 日本久久久久久久| 亚洲国产中文字幕在线观看| 欧美性猛交xxxx黑人猛交| 日本欧美在线视频| 国产成人精品久久亚洲高清不卡| 国产视频亚洲精品| 国产精品综合久久久| 久久视频在线观看免费| 97在线观看视频国产| 亚洲国产精品va在线看黑人| 国内精品一区二区三区四区| 91中文在线视频| 55夜色66夜色国产精品视频| 91国产中文字幕| 日韩成人黄色av| 国语自产精品视频在线看抢先版图片| 欧美久久精品午夜青青大伊人| 久久综合网hezyo| 国产精品网站视频|