| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585 |
- //
- // TextDrawable.m
- // pdftest
- //
- // Created by Ray on 10/12/16.
- // Copyright © 2016 United Software Applications, Inc. All rights reserved.
- //
- #import "TextDrawable.h"
- #import <CoreText/CoreText.h>
- #import "TextUtils.h"
- @implementation TextDrawable
- -(instancetype) init:(CGRect) rect source_type:(NSString*) source_type source:(NSString*)source textAlignment:(NSString*)textAlignment vAlign:(NSString*)vAlign size:(NSString*)size
- {
-
- if (self = [super init]) {
- // NSMutableDictionary* m1=[drawableTemplate mutableCopy];
- // NSMutableDictionary* m2=[drawableTemplate mutableCopy];
- // [self setDrawableTemplate:[[RAUtils string2dict:[RAUtils dict2string:drawableTemplate]] mutableCopy] ];
-
- NSMutableDictionary * drawableTemplate = [TextDrawable createTextTemplate:rect source_type:source_type source:source textAlignment:textAlignment vAlign:vAlign size:size];
-
-
- [self setDrawableTemplate:[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:drawableTemplate]] ];
-
- }
- return self;
-
- }
- +(NSMutableDictionary *) createTextTemplate:(CGRect) rect source_type:(NSString*) source_type source:(NSString*)source textAlignment:(NSString*)textAlignment vAlign:(NSString*)vAlign size:(NSString*)size
- {
-
-
-
-
- NSLog(@"createTextTemplate text align : %@",textAlignment);
-
- if(textAlignment.length==0)
- textAlignment= @"Center";
- if(vAlign.length==0)
- vAlign= @"Middle";
- if(size.length==0)
- vAlign= @"10";
-
-
-
- NSMutableDictionary* ret=[super createDrawableTemplate:rect];
-
- ret[@"type"]=@"text" ;
- ret[@"source_type"]=source_type ;
- ret[@"source"]=source ;
- ret[@"text"]=source ;
- ret[@"textAlignment"]=textAlignment ;
- ret[@"vAlign"]=vAlign ;
- ret[@"size"]=size ;
-
- return ret;
- }
- -(void) setDrawableTemplate:(NSMutableDictionary *)drawableTemplate
- {
-
- [super setDrawableTemplate:drawableTemplate];
-
-
-
- NSString* align= drawableTemplate[@"textAlignment"];
-
- NSLog(@"setDrawableTemplate text align : %@",align);
- if(align.length==0 || [align.lowercaseString isEqualToString:@"left"])
- {
- self.textalignment= kCTTextAlignmentLeft;
- }
- else if([align.lowercaseString isEqualToString:@"right"])
- {
- self.textalignment= kCTTextAlignmentRight;
- }
- else if([align.lowercaseString isEqualToString:@"center"])
- {
- self.textalignment= kCTTextAlignmentCenter;
- }
- else
- {
- self.textalignment= kCTTextAlignmentLeft;
- }
-
- self.lineSpace = 0;
- self.paragraphSpace = 0;
-
-
- NSString* colorvalue=drawableTemplate[@"color"];
- if(colorvalue.length>0 )
- {
- unsigned long color = strtoul([colorvalue UTF8String],0,16);
- self.textColor= UIColorFromRGB(color);
- }
- else
- {
- self.textColor= [UIColor blackColor];
-
- }
-
-
- // kCTTextAlignmentJustified CT_ENUM_AVAILABLE(10_8, 6_0) = 3,
- // kCTTextAlignmentNatural CT_ENUM_AVAILABLE(10_8, 6_0) = 4,
-
-
- // _drawableTemplate = drawableTemplate;
- // self.margin_left=[self.drawableTemplate[@"margin_left"] doubleValue];
- // self.margin_right=[self.drawableTemplate[@"margin_right"] doubleValue];
- // self.margin_top=[self.drawableTemplate[@"margin_top"] doubleValue];
- // self.margin_bottom=[self.drawableTemplate[@"margin_bottom"] doubleValue];
- // self.rect = CGRectMake(0, 0, [self.drawableTemplate[@"width"] doubleValue], [self.drawableTemplate[@"height"] doubleValue]);
- }
- -(CGRect) Query_Rect:(CGContextRef) context dataSource:(NSMutableDictionary*)data ParentRect:(CGRect)p_rect startX:(double) x startY:(double) y flipHeight:(double)flip_height range:(NSRange)between_header_and_footer
- {
-
- bool expand=[self.drawableTemplate[@"expand"] boolValue];
- if(!expand)
- {
- CGRect parentrect = [self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
-
- return parentrect;
- }
- else
- {
-
-
-
-
- NSString * source=self.drawableTemplate[@"source_type"];
- if(source==nil)
- source=@"const";
- if([source isEqualToString:@"const"])
- {
- self.text=self.drawableTemplate[@"text"];
- // self.text=[self.text stringByReplacingOccurrencesOfString:@"\r\n" withString:@"<br>"];
-
- }
- else if([source isEqualToString:@"data"])
- {
- if([self.drawableTemplate[@"source_isexpression"] boolValue])
- {
- NSString *content = data[self.drawableTemplate[@"source"]];
- NSString *pattern = @"\\$\\.\\{([\\s\\S]*?)\\}\\.\\$";
- NSArray* matches=[TextUtils expression_varable:content regex:pattern];
- // if (matches) {
- // for (NSTextCheckingResult *match in matches) {
- // for (int i = 0; i < match.numberOfRanges; ++i) {
- // DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // }
- // }
- // }
- if (matches)
- {
- self.text=content;
- for (NSTextCheckingResult *match in matches)
- {
-
- for (int i = 0; i < match.numberOfRanges/2; ++i) {
- DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- DebugLog(@"%d-> %@",i+1, [content substringWithRange:[match rangeAtIndex:i+1]]);
-
- self.text=[self.text stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[NSString stringWithFormat:@"%@",data[[content substringWithRange:[match rangeAtIndex:i+1]]]]];
- }
- }
- }
- //self.text=content;
-
- }
- else
- {
- self.text=data[self.drawableTemplate[@"source"]];
- }
- }
-
- if(self.text==nil)
- self.text=@"";
-
-
-
-
-
- // if([self.text isEqualToString:@"www.newpacificdirect.com"])
- // {
- // int debug=0;
- // }
-
-
- bool bold = [self.drawableTemplate[@"bold"] boolValue];
- bool italic = [self.drawableTemplate[@"italic"] boolValue];
- NSString* font=self.drawableTemplate[@"font"];
-
- // [super flipContext:context ContextHeight:flip_height];
- // super flipContext:context ContextHeight:<#(double)#>
- CGFloat fontsize = [self.drawableTemplate[@"size"] doubleValue];
-
- //NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[title dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
- //创建AttributeStringfdsa
-
- NSMutableAttributedString *string = nil;
- // if([self.drawableTemplate[@"ishtml"] boolValue])
- // {
- // string=[[[NSAttributedString alloc] initWithData:[self.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil] mutableCopy];
- //
- // }
- // else
- {
- string=[[NSMutableAttributedString alloc] initWithString:self.text];
- //创建字体以及字体大小
- // CTFontRef ctfont = [self CreateFont:font size:fontsize bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // // CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // //字体,把helvetica 样式加到整个,string上
- // [string addAttribute:(id)kCTFontAttributeName
- // value:CFBridgingRelease(ctfont)
- // range:NSMakeRange(0, [string length])];
- //
- // //字体样式 ,把helveticaBold 样式加到整个,string上
- // // [string addAttribute:(id)kCTFontAttributeName
- // // value:CFBridgingRelease(helveticaBold)
- // // range:NSMakeRange(0, [string length])];
- //
- // //颜色,此处为黑色,你可以自己改颜色,[UIColor redColor]
- // [string addAttribute:(id)kCTForegroundColorAttributeName
- // value:(id)self.textColor.CGColor
- // range:NSMakeRange(0, [string length])];
-
- string = [self richtext2attributedstring:string font:font size:fontsize bold:bold];
-
-
- //设置字体间距
- long number = self.characterSpace;
- CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
- [string addAttribute:(id)kCTKernAttributeName value:CFBridgingRelease(num) range:NSMakeRange(0, [string length])];
- //CFRelease(num);
-
-
- //创建文本对齐方式
- CTTextAlignment alignment = self.textalignment;//对齐方
- CTParagraphStyleSetting alignmentStyle;
- alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;
- alignmentStyle.valueSize=sizeof(alignment);
- alignmentStyle.value=&alignment;
-
- //创建文本, 行间距
- CGFloat lineSpace=self.lineSpace;//间距数据
- CTParagraphStyleSetting lineSpaceStyle;
- lineSpaceStyle.spec=kCTParagraphStyleSpecifierLineSpacing;
- lineSpaceStyle.valueSize=sizeof(lineSpace);
- lineSpaceStyle.value=&lineSpace;
-
- //设置 line break;
- CTLineBreakMode linebreakmode = kCTLineBreakByTruncatingTail;
- CTParagraphStyleSetting linebreakStyle;
- linebreakStyle.spec = kCTParagraphStyleSpecifierLineBreakMode;
- linebreakStyle.valueSize = sizeof(CGFloat);
- linebreakStyle.value = &linebreakmode;
-
-
- //设置 段落间距
- CGFloat paragraph = self.paragraphSpace;
- CTParagraphStyleSetting paragraphStyle;
- paragraphStyle.spec = kCTParagraphStyleSpecifierParagraphSpacing;
- paragraphStyle.valueSize = sizeof(CGFloat);
- paragraphStyle.value = ¶graph;
-
-
-
-
- //创建样式数组
- CTParagraphStyleSetting settings[]={
- alignmentStyle,lineSpaceStyle,paragraphStyle,linebreakStyle
- };
-
- //设置样式
- CTParagraphStyleRef paragraphStyle1 = CTParagraphStyleCreate(settings, sizeof(settings));
-
- //给字符串添加样式attribute
- [string addAttribute:(id)kCTParagraphStyleAttributeName
- value:CFBridgingRelease(paragraphStyle1)
- range:NSMakeRange(0, [string length])];
-
- }
-
-
-
- // CGRect pdfrect=[self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
- // [string drawInRect:pdfrect];
-
-
- // [self.text drawInRect:pdfrect withAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:40],NSForegroundColorAttributeName : [UIColor redColor]}];
-
- // layout master
- CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);
- //计算文本绘制size ,这里300是文字宽度,你可以自己更改为247,但是要记得,在height 方法里的这个位置,也改为247
- CGSize tmpSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0,0), NULL, CGSizeMake(self.rect.size.width-self.margin_left-self.margin_right, MAXFLOAT), NULL);
- //创建textBoxSize以设置view的frame
- CGSize textBoxSize = CGSizeMake((int)tmpSize.width + 1, (int)tmpSize.height + 1);
- // DebugLog(@"textBoxSize0 == %f,%f,%f",textBoxSize.width,textBoxSize.height,textBoxSize.width / textBoxSize.height);
- // self.frame = CGRectMake(0, 0, textBoxSize.width , textBoxSize.height);
- // [string release];
-
- //- (void)drawRect:(CGRect)rect;代码
-
-
-
-
- // CGMutablePathRef leftColumnPath = CGPathCreateMutable();
-
- CGRect parentrect = [self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
-
-
- double height =0;
- if(tmpSize.height<parentrect.size.height)
- height=tmpSize.height;
- else
- if(expand)
- {
- height=tmpSize.height;
- self.rect = CGRectMake(self.rect.origin.x, self.rect.origin.y, self.rect.size.width, height+self.margin_top+self.margin_bottom);
- }
- else
- height=parentrect.size.height;
-
- CGRect rect=CGRectMake(parentrect.origin.x, parentrect.origin.y, parentrect.size.width, height);
-
- CGRect expand_rect=rect;
-
- // CGRect rect=[RAUtils rectAlign:parentrect rect:scalerect hAlign:self.hAlign vAlign:self.vAlign];
- // rect=[RAUtils rectVAlign:parentrect rect:rect vAlign:self.vAlign];
- //
- // // CGRect pdfrect = [self to_pdf_rect:p_rect pos:self.rect contextHeight:flip_height];
- //
- // rect= [self parent_to_pdf_rect:rect contextHeight:flip_height];
- // // pdfrect=CGRectMake(pdfrect.origin.x, flip_height-pdfrect.origin.y, pdfrect.size.width, pdfrect.size.height);
- // CGPathAddRect(leftColumnPath, NULL,
- // rect);
- //
- // CTFrameRef leftFrame = CTFramesetterCreateFrame(framesetter,
- // CFRangeMake(0, 0),
- // leftColumnPath, NULL);
- //
- // // DebugLog(@"textBoxSize1 == %f,%f",self.frame.size.width,self.frame.size.height);
- // // flip the coordinate system
- // // CGContextRef context = UIGraphicsGetCurrentContext();
- //
- //
- // // CGContextClearRect(context, self.rect);
- // // CGContextSetFillColorWithColor(context, [[UIColor whiteColor]CGColor]);
- // // CGContextFillRect(context, CGRectMake(0, 0, self.rect.size.width, self.rect.size.height));
- //
- //
- // CGContextSetTextMatrix(context, CGAffineTransformIdentity);
- // // CGContextTranslateCTM(context, 0, self.rect.size.height);
- // // CGContextScaleCTM(context, 1.0, -1.0);
- //
- // // draw
- // CTFrameDraw(leftFrame, context);
- //
- //
- // CFRelease(leftFrame);
- // // cleanup
- //
- // CGPathRelease(leftColumnPath);
- CFRelease(framesetter);
-
-
- // return self.rect;
- // [self DrawBound:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
- if(expand&&expand_rect.size.height>parentrect.size.height)
- return expand_rect;
- else
- return parentrect;
- // return CGPointMake(parentrect.origin.x+parentrect.size.width, parentrect.origin.y+parentrect.size.height);
-
- // [super restoreFlip:context ContextHeight:flip_height];
- }
-
-
- }
- -(CTFontRef)CreateFont:(NSString*)name size:(double)size bold:(bool)bold
- {
-
- if(name.length==0)
- {
- name=@"Helvetica";
- // name=@"DejaVu Sans";
- }
- if(size==0)
- {
- size=10;
- }
- NSString* style = @"Regular";
- if(bold)
- style=@"Bold";
-
- //name=@"Courier";
-
- NSDictionary *fontAttributes =
- [NSDictionary dictionaryWithObjectsAndKeys:
- name, (NSString *)kCTFontFamilyNameAttribute,
- style, (NSString *)kCTFontStyleNameAttribute,
- [NSNumber numberWithFloat:size],
- (NSString *)kCTFontSizeAttribute,
- nil];
- // Create a descriptor.
- CFDictionaryRef cffontAttributes =(__bridge CFDictionaryRef)fontAttributes;
- CTFontDescriptorRef descriptor =
- CTFontDescriptorCreateWithAttributes(cffontAttributes);
-
- // CFBridgingRelease(cffontAttributes);
-
- // Create a font using the descriptor.
- CTFontRef font = CTFontCreateWithFontDescriptor(descriptor, 0.0, NULL);
- CFBridgingRelease(descriptor);
-
- return font;
-
- // if(bold)
- // {
- // CTFontRef font=CTFontCreateWithName((__bridge CFStringRef)name, size, NULL);
- // CTFontRef font_bold =CTFontCreateCopyWithSymbolicTraits(font, 0.0, NULL, kCTFontBoldTrait, kCTFontBoldTrait);
- // CFBridgingRelease(font);
- // return font_bold;
- // }
- // return CTFontCreateWithName((__bridge CFStringRef)name, size, NULL);
- }
- //-(NSString*) QueryFontName:(NSString*)font
- //{
- // if(font==nil)
- // {
- // return @"Helvetica";
- // }
- // else if([font.lowercaseString isEqualToString:@"kalinga"])
- // {
- // return @"kalinga";
- // }
- // return @"Helvetica";
- //}
- -(NSMutableAttributedString*) richtext2attributedstring:(NSMutableAttributedString*)string font:(NSString*)font size:(double)size bold:(bool)bold
- {
- // UILabel* uilabel=[[UILabel alloc]init];
- // uilabel.font=[UIFont fontWithName:font size:size];
- // NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[self.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
- // uilabel.attributedText = attrStr;
- // DebugLog(@"%@", attrStr);
- // DebugLog(@"%@", uilabel.attributedText);
-
- CTFontRef ctfont = [self CreateFont:font size:size bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);b
-
- //CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- //字体,把helvetica 样式加到整个,string上
- [string addAttribute:(id)kCTFontAttributeName
- value:CFBridgingRelease(ctfont)
- range:NSMakeRange(0, [string length])];
-
- //颜色,此处为黑色,你可以自己改颜色,[UIColor redColor]
- [string addAttribute:(id)kCTForegroundColorAttributeName
- value:(id)self.textColor.CGColor
- range:NSMakeRange(0, [string length])];
-
-
- if(!bold)
- {
- CTFontRef ctfont_bold = [self CreateFont:font size:size bold:true];
- NSString* newstring= nil;
- // NSString *content = string.string ;
- NSString *pattern = @"\\<b\\>([\\s\\S]*?)\\<\\/b\\>";
- // NSArray* matches=[TextUtils expression_varable:content regex:pattern];
- // if (matches) {
- // for (NSTextCheckingResult *match in matches) {
- // for (int i = 0; i < match.numberOfRanges; ++i) {
- // DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // }
- // }
- // }
- NSTextCheckingResult * match=[TextUtils expression_findfistMatch:string.string regex:pattern];
-
- while(match)
- {
- //for (int i = 0; i < match.numberOfRanges/2; ++i)
- {
- int i=0;
- DebugLog(@"%d->range with richtext label: %d,%d",i, [match rangeAtIndex:i].location,[match rangeAtIndex:i].length);
- DebugLog(@"%d-> range of text: %d,%d ",i+1, [match rangeAtIndex:i+1].location,[match rangeAtIndex:i+1].length);
-
-
- DebugLog(@"string length: %d",string.string.length);
- [string addAttribute:(id)kCTFontAttributeName
- value:(__bridge id _Nonnull)(ctfont_bold)
- range:[match rangeAtIndex:i+1]];
-
- [string replaceCharactersInRange:NSMakeRange([match rangeAtIndex:i+1].location+[match rangeAtIndex:i+1].length, [match rangeAtIndex:i].location+[match rangeAtIndex:i].length-([match rangeAtIndex:i+1].location+[match rangeAtIndex:i+1].length)) withString:@""];
- [string replaceCharactersInRange:NSMakeRange([match rangeAtIndex:i].location, [match rangeAtIndex:i+1].location-[match rangeAtIndex:i].location) withString:@""];
-
- DebugLog(@"string after replace: %@",string.string);
- //newstring=[newstring stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[content substringWithRange:[match rangeAtIndex:i+1]]];
- match=[TextUtils expression_findfistMatch:string.string regex:pattern];
- }
- }
- // if (matches)
- // {
- // newstring=content;
- // for (NSTextCheckingResult *match in matches)
- // {
- //
- // for (int i = 0; i < match.numberOfRanges/2; ++i)
- // {
- // DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // DebugLog(@"%d-> %@",i+1, [content substringWithRange:[match rangeAtIndex:i+1]]);
- //
- // [string addAttribute:(id)kCTFontAttributeName
- // value:CFBridgingRelease(ctfont_bold)
- // range:[match rangeAtIndex:i+1]];
- //
- // newstring=[newstring stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[content substringWithRange:[match rangeAtIndex:i+1]]];
- //
- // }
- // }
- // }
-
-
-
- CFBridgingRelease(ctfont_bold);
- }
-
-
- return string;
- }
- -(CGRect) Draw:(CGContextRef) context dataSource:(NSMutableDictionary*)data ParentRect:(CGRect)p_rect startX:(double) x startY:(double) y flipHeight:(double)flip_height range:(NSRange)between_header_and_footer
- {
-
-
-
-
- NSString * source=self.drawableTemplate[@"source_type"];
- if(source==nil)
- source=@"const";
- if([source isEqualToString:@"const"])
- {
- self.text=self.drawableTemplate[@"text"];
- // self.text=[self.text stringByReplacingOccurrencesOfString:@"\r\n" withString:@"<br>"];
-
- }
- else if([source isEqualToString:@"data"])
- {
- if([self.drawableTemplate[@"source_isexpression"] boolValue])
- {
- NSString *content = data[self.drawableTemplate[@"source"]];
- NSString *pattern = @"\\$\\.\\{([\\s\\S]*?)\\}\\.\\$";
- NSArray* matches=[TextUtils expression_varable:content regex:pattern];
- // if (matches) {
- // for (NSTextCheckingResult *match in matches) {
- // for (int i = 0; i < match.numberOfRanges; ++i) {
- // DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // }
- // }
- // }
- if (matches)
- {
- self.text=content;
- for (NSTextCheckingResult *match in matches)
- {
-
- for (int i = 0; i < match.numberOfRanges/2; ++i) {
- DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- DebugLog(@"%d-> %@",i+1, [content substringWithRange:[match rangeAtIndex:i+1]]);
-
- self.text=[self.text stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[NSString stringWithFormat:@"%@",data[[content substringWithRange:[match rangeAtIndex:i+1]]]]];
- }
- }
- }
- //self.text=content;
-
- }
- else
- {
- self.text=data[self.drawableTemplate[@"source"]];
- }
- }
-
- if(self.text==nil)
- self.text=@"";
-
-
-
-
-
- // if([self.text isEqualToString:@"www.newpacificdirect.com"])
- // {
- // int debug=0;
- // }
-
-
- bool bold = [self.drawableTemplate[@"bold"] boolValue];
- bool italic = [self.drawableTemplate[@"italic"] boolValue];
- NSString* font=self.drawableTemplate[@"font"];
-
- // [super flipContext:context ContextHeight:flip_height];
- // super flipContext:context ContextHeight:<#(double)#>
- CGFloat fontsize = [self.drawableTemplate[@"size"] doubleValue];
-
- //NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[title dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
- //创建AttributeStringfdsa
-
- NSMutableAttributedString *string = nil;
- // if([self.drawableTemplate[@"ishtml"] boolValue])
- // {
- // string=[[[NSAttributedString alloc] initWithData:[self.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil] mutableCopy];
- //
- // }
- // else
-
- string=[[NSMutableAttributedString alloc] initWithString:self.text];
- //创建字体以及字体大小
- // CTFontRef ctfont = [self CreateFont:font size:fontsize bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // // CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // //字体,把helvetica 样式加到整个,string上
- // [string addAttribute:(id)kCTFontAttributeName
- // value:CFBridgingRelease(ctfont)
- // range:NSMakeRange(0, [string length])];
- //
- // //字体样式 ,把helveticaBold 样式加到整个,string上
- // // [string addAttribute:(id)kCTFontAttributeName
- // // value:CFBridgingRelease(helveticaBold)
- // // range:NSMakeRange(0, [string length])];
- //
- // //颜色,此处为黑色,你可以自己改颜色,[UIColor redColor]
- // [string addAttribute:(id)kCTForegroundColorAttributeName
- // value:(id)self.textColor.CGColor
- // range:NSMakeRange(0, [string length])];
-
- string = [self richtext2attributedstring:string font:font size:fontsize bold:bold];
-
-
- // //设置字体间距
- // long number = self.characterSpace;
- // CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
- // [string addAttribute:(id)kCTKernAttributeName value:CFBridgingRelease(num) range:NSMakeRange(0, [string length])];
- //CFRelease(num);
-
-
- //创建文本对齐方式
- CTTextAlignment alignment = self.textalignment;//对齐方
- CTParagraphStyleSetting alignmentStyle;
- alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;
- alignmentStyle.valueSize=sizeof(alignment);
- alignmentStyle.value=&alignment;
- //
- // //创建文本, 行间距
- // CGFloat lineSpace=self.lineSpace;//间距数据
- // CTParagraphStyleSetting lineSpaceStyle;
- // lineSpaceStyle.spec=kCTParagraphStyleSpecifierLineSpacing;
- // lineSpaceStyle.valueSize=sizeof(lineSpace);
- // lineSpaceStyle.value=&lineSpace;
- //
- //设置 line break;
- CTLineBreakMode linebreakmode = kCTLineBreakByTruncatingTail;
- CTParagraphStyleSetting linebreakStyle;
- linebreakStyle.spec = kCTParagraphStyleSpecifierLineBreakMode;
- linebreakStyle.valueSize = sizeof(CGFloat);
- linebreakStyle.value = &linebreakmode;
- //
- //
- // //设置 段落间距
- // CGFloat paragraph = self.paragraphSpace;
- // CTParagraphStyleSetting paragraphStylesetting;
- // paragraphStylesetting.spec = kCTParagraphStyleSpecifierParagraphSpacing;
- // paragraphStylesetting.valueSize = sizeof(CGFloat);
- // paragraphStylesetting.value = ¶graph;
- //
- //
- //
- //
- //创建样式数组
- CTParagraphStyleSetting settings[]={
- alignmentStyle/*,linebreakStyle,lineSpaceStyle,paragraphStylesetting*/
- };
-
- //设置样式
- CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, sizeof(settings));
-
- //给字符串添加样式attribute
- [string addAttribute:(id)kCTParagraphStyleAttributeName
- value:CFBridgingRelease(paragraphStyle)
- range:NSMakeRange(0, [string length])];
-
-
-
-
-
- // CGRect pdfrect=[self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
- // [string drawInRect:pdfrect];
-
-
- // [self.text drawInRect:pdfrect withAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:40],NSForegroundColorAttributeName : [UIColor redColor]}];
-
- // layout master
- CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);
- //计算文本绘制size ,这里300是文字宽度,你可以自己更改为247,但是要记得,在height 方法里的这个位置,也改为247
- CGSize tmpSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0,0), NULL, CGSizeMake(self.rect.size.width-self.margin_left-self.margin_right, MAXFLOAT), NULL);
- //创建textBoxSize以设置view的frame
- CGSize textBoxSize = CGSizeMake((int)tmpSize.width + 1, (int)tmpSize.height + 1);
- // DebugLog(@"textBoxSize0 == %f,%f,%f",textBoxSize.width,textBoxSize.height,textBoxSize.width / textBoxSize.height);
- // self.frame = CGRectMake(0, 0, textBoxSize.width , textBoxSize.height);
- // [string release];
-
- //- (void)drawRect:(CGRect)rect;代码
-
-
-
-
- CGMutablePathRef leftColumnPath = CGPathCreateMutable();
-
- CGRect parentrect = [self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
-
- bool expand=[self.drawableTemplate[@"expand"] boolValue];
- double height =0;
- if(tmpSize.height<parentrect.size.height)
- height=tmpSize.height;
- else
- if(expand)
- {
- height=tmpSize.height;
- self.rect = CGRectMake(self.rect.origin.x, self.rect.origin.y, self.rect.size.width, height+self.margin_top+self.margin_bottom);
- }
- else
- height=parentrect.size.height;
-
- CGRect rect=CGRectMake(parentrect.origin.x, parentrect.origin.y, parentrect.size.width, height);
-
- CGRect expand_rect=rect;
-
- // CGRect rect=[RAUtils rectAlign:parentrect rect:scalerect hAlign:self.hAlign vAlign:self.vAlign];
- rect=[TextUtils rectVAlign:parentrect rect:rect vAlign:self.vAlign];
-
- // CGRect pdfrect = [self to_pdf_rect:p_rect pos:self.rect contextHeight:flip_height];
-
- rect= [self parent_to_pdf_rect:rect contextHeight:flip_height];
- // pdfrect=CGRectMake(pdfrect.origin.x, flip_height-pdfrect.origin.y, pdfrect.size.width, pdfrect.size.height);
- CGPathAddRect(leftColumnPath, NULL,
- rect);
-
- CTFrameRef leftFrame = CTFramesetterCreateFrame(framesetter,
- CFRangeMake(0, 0),
- leftColumnPath, NULL);
-
- // DebugLog(@"textBoxSize1 == %f,%f",self.frame.size.width,self.frame.size.height);
- // flip the coordinate system
- // CGContextRef context = UIGraphicsGetCurrentContext();
-
-
- // CGContextClearRect(context, self.rect);
- // CGContextSetFillColorWithColor(context, [[UIColor whiteColor]CGColor]);
- // CGContextFillRect(context, CGRectMake(0, 0, self.rect.size.width, self.rect.size.height));
-
-
- CGContextSetTextMatrix(context, CGAffineTransformIdentity);
- // CGContextTranslateCTM(context, 0, self.rect.size.height);
- // CGContextScaleCTM(context, 1.0, -1.0);
-
- // draw
- CTFrameDraw(leftFrame, context);
-
-
- CFRelease(leftFrame);
- // cleanup
-
- CGPathRelease(leftColumnPath);
- CFRelease(framesetter);
-
-
- // return self.rect;
- [self DrawBound:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
- if(expand&&expand_rect.size.height>parentrect.size.height)
- return expand_rect;
- else
- return parentrect;
- // return CGPointMake(parentrect.origin.x+parentrect.size.width, parentrect.origin.y+parentrect.size.height);
-
- // [super restoreFlip:context ContextHeight:flip_height];
- }
- @end
- ////
- //// TextDrawable.m
- //// pdftest
- ////
- //// Created by Ray on 10/12/16.
- //// Copyright © 2016 United Software Applications, Inc. All rights reserved.
- ////
- //
- //#import "TextDrawable.h"
- //#import <CoreText/CoreText.h>
- //#import "TextUtils.h"
- //
- //@implementation TextDrawable
- //
- //
- //-(instancetype) init:(CGRect) rect source_type:(NSString*) source_type source:(NSString*)source textAlignment:(NSString*)textAlignment vAlign:(NSString*)vAlign size:(NSString*)size
- //{
- //
- // if (self = [super init]) {
- // // NSMutableDictionary* m1=[drawableTemplate mutableCopy];
- // // NSMutableDictionary* m2=[drawableTemplate mutableCopy];
- // // [self setDrawableTemplate:[[RAUtils string2dict:[RAUtils dict2string:drawableTemplate]] mutableCopy] ];
- //
- // NSMutableDictionary * drawableTemplate = [TextDrawable createTextTemplate:rect source_type:source_type source:source textAlignment:textAlignment vAlign:vAlign size:size];
- //
- //
- // [self setDrawableTemplate:[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:drawableTemplate]] ];
- //
- // }
- // return self;
- //
- //}
- //+(NSMutableDictionary *) createTextTemplate:(CGRect) rect source_type:(NSString*) source_type source:(NSString*)source textAlignment:(NSString*)textAlignment vAlign:(NSString*)vAlign size:(NSString*)size
- //{
- //
- //
- //
- //
- //
- //
- // if(textAlignment.length==0)
- // textAlignment= @"Center";
- // if(vAlign.length==0)
- // vAlign= @"Middle";
- // if(size.length==0)
- // vAlign= @"10";
- //
- //
- //
- // NSMutableDictionary* ret=[super createDrawableTemplate:rect];
- //
- // ret[@"type"]=@"text" ;
- // ret[@"source_type"]=source_type ;
- // ret[@"source"]=source ;
- // ret[@"text"]=source ;
- // ret[@"textAlignment"]=textAlignment ;
- // ret[@"vAlign"]=vAlign ;
- // ret[@"size"]=size ;
- //
- // return ret;
- //}
- //
- //
- //-(void) setDrawableTemplate:(NSMutableDictionary *)drawableTemplate
- //{
- //
- // [super setDrawableTemplate:drawableTemplate];
- //
- //
- //
- // NSString* align= drawableTemplate[@"textAlignment"];
- // if(align.length==0 || [align.lowercaseString isEqualToString:@"left"])
- // {
- // self.textalignment= kCTTextAlignmentLeft;
- // }
- // else if([align.lowercaseString isEqualToString:@"right"])
- // {
- // self.textalignment= kCTTextAlignmentRight;
- // }
- // else if([align.lowercaseString isEqualToString:@"center"])
- // {
- // self.textalignment= kCTTextAlignmentCenter;
- // }
- // else
- // {
- // self.textalignment= kCTTextAlignmentLeft;
- // }
- //
- //// self.lineSpace = 0;
- //// self.paragraphSpace = 0;
- //
- //
- // NSString* colorvalue=drawableTemplate[@"color"];
- // if(colorvalue.length>0 )
- // {
- // unsigned long color = strtoul([colorvalue UTF8String],0,16);
- // self.textColor= UIColorFromRGB(color);
- // }
- // else
- // {
- // self.textColor= [UIColor blackColor];
- //
- // }
- //
- //
- // // kCTTextAlignmentJustified CT_ENUM_AVAILABLE(10_8, 6_0) = 3,
- // // kCTTextAlignmentNatural CT_ENUM_AVAILABLE(10_8, 6_0) = 4,
- //
- //
- // // _drawableTemplate = drawableTemplate;
- // // self.margin_left=[self.drawableTemplate[@"margin_left"] doubleValue];
- // // self.margin_right=[self.drawableTemplate[@"margin_right"] doubleValue];
- // // self.margin_top=[self.drawableTemplate[@"margin_top"] doubleValue];
- // // self.margin_bottom=[self.drawableTemplate[@"margin_bottom"] doubleValue];
- // // self.rect = CGRectMake(0, 0, [self.drawableTemplate[@"width"] doubleValue], [self.drawableTemplate[@"height"] doubleValue]);
- //}
- //
- //
- //-(CGRect) Query_Rect:(CGContextRef) context dataSource:(NSMutableDictionary*)data ParentRect:(CGRect)p_rect startX:(double) x startY:(double) y flipHeight:(double)flip_height range:(NSRange)between_header_and_footer
- //{
- //
- // bool expand=[self.drawableTemplate[@"expand"] boolValue];
- // if(!expand)
- // {
- // CGRect parentrect = [self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
- //
- // return parentrect;
- // }
- // else
- // {
- //
- //
- //
- //
- // NSString * source=self.drawableTemplate[@"source_type"];
- // if(source==nil)
- // source=@"const";
- // if([source isEqualToString:@"const"])
- // {
- // self.text=self.drawableTemplate[@"text"];
- // // self.text=[self.text stringByReplacingOccurrencesOfString:@"\r\n" withString:@"<br>"];
- //
- // }
- // else if([source isEqualToString:@"data"])
- // {
- // if([self.drawableTemplate[@"source_isexpression"] boolValue])
- // {
- // NSString *content = data[self.drawableTemplate[@"source"]];
- // NSString *pattern = @"\\$\\.\\{([\\s\\S]*?)\\}\\.\\$";
- // NSArray* matches=[TextUtils expression_varable:content regex:pattern];
- // // if (matches) {
- // // for (NSTextCheckingResult *match in matches) {
- // // for (int i = 0; i < match.numberOfRanges; ++i) {
- // // DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // // }
- // // }
- // // }
- // if (matches)
- // {
- // self.text=content;
- // for (NSTextCheckingResult *match in matches)
- // {
- //
- // for (int i = 0; i < match.numberOfRanges/2; ++i) {
- // DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // DebugLog(@"%d-> %@",i+1, [content substringWithRange:[match rangeAtIndex:i+1]]);
- //
- // self.text=[self.text stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[NSString stringWithFormat:@"%@",data[[content substringWithRange:[match rangeAtIndex:i+1]]]]];
- // }
- // }
- // }
- // //self.text=content;
- //
- // }
- // else
- // {
- // self.text=data[self.drawableTemplate[@"source"]];
- // }
- // }
- //
- // if(self.text==nil)
- // self.text=@"";
- //
- //
- //
- //
- //
- //// if([self.text isEqualToString:@"www.newpacificdirect.com"])
- //// {
- //// int debug=0;
- //// }
- //
- //
- // bool bold = [self.drawableTemplate[@"bold"] boolValue];
- // bool italic = [self.drawableTemplate[@"italic"] boolValue];
- // NSString* font=self.drawableTemplate[@"font"];
- //
- // // [super flipContext:context ContextHeight:flip_height];
- // // super flipContext:context ContextHeight:<#(double)#>
- // CGFloat fontsize = [self.drawableTemplate[@"size"] doubleValue];
- //
- // //NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[title dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
- // //创建AttributeStringfdsa
- //
- // NSMutableAttributedString *string = nil;
- // // if([self.drawableTemplate[@"ishtml"] boolValue])
- // // {
- // // string=[[[NSAttributedString alloc] initWithData:[self.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil] mutableCopy];
- // //
- // // }
- // // else
- // {
- // string=[[NSMutableAttributedString alloc] initWithString:self.text];
- // //创建字体以及字体大小
- // // CTFontRef ctfont = [self CreateFont:font size:fontsize bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // // // CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // // //字体,把helvetica 样式加到整个,string上
- // // [string addAttribute:(id)kCTFontAttributeName
- // // value:CFBridgingRelease(ctfont)
- // // range:NSMakeRange(0, [string length])];
- // //
- // // //字体样式 ,把helveticaBold 样式加到整个,string上
- // // // [string addAttribute:(id)kCTFontAttributeName
- // // // value:CFBridgingRelease(helveticaBold)
- // // // range:NSMakeRange(0, [string length])];
- // //
- // // //颜色,此处为黑色,你可以自己改颜色,[UIColor redColor]
- // // [string addAttribute:(id)kCTForegroundColorAttributeName
- // // value:(id)self.textColor.CGColor
- // // range:NSMakeRange(0, [string length])];
- //
- // string = [self richtext2attributedstring:string font:font size:fontsize bold:bold];
- //
- //
- // //设置字体间距
- // long number = self.characterSpace;
- // CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
- // [string addAttribute:(id)kCTKernAttributeName value:CFBridgingRelease(num) range:NSMakeRange(0, [string length])];
- // //CFRelease(num);
- //
- //
- // //创建文本对齐方式
- // CTTextAlignment alignment = self.textalignment;//对齐方
- // CTParagraphStyleSetting alignmentStyle;
- // alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;
- // alignmentStyle.valueSize=sizeof(alignment);
- // alignmentStyle.value=&alignment;
- //
- // //创建文本, 行间距
- // CGFloat lineSpace=self.lineSpace;//间距数据
- // CTParagraphStyleSetting lineSpaceStyle;
- // lineSpaceStyle.spec=kCTParagraphStyleSpecifierLineSpacing;
- // lineSpaceStyle.valueSize=sizeof(lineSpace);
- // lineSpaceStyle.value=&lineSpace;
- //
- // //设置 line break;
- // CTLineBreakMode linebreakmode = kCTLineBreakByTruncatingTail;
- // CTParagraphStyleSetting linebreakStyle;
- // linebreakStyle.spec = kCTParagraphStyleSpecifierLineBreakMode;
- // linebreakStyle.valueSize = sizeof(CGFloat);
- // linebreakStyle.value = &linebreakmode;
- //
- //
- // //设置 段落间距
- // CGFloat paragraph = self.paragraphSpace;
- // CTParagraphStyleSetting paragraphStyle;
- // paragraphStyle.spec = kCTParagraphStyleSpecifierParagraphSpacing;
- // paragraphStyle.valueSize = sizeof(CGFloat);
- // paragraphStyle.value = ¶graph;
- //
- //
- //
- //
- // //创建样式数组
- // CTParagraphStyleSetting settings[]={
- // alignmentStyle,lineSpaceStyle,paragraphStyle,linebreakStyle
- // };
- //
- // //设置样式
- // CTParagraphStyleRef paragraphStyle1 = CTParagraphStyleCreate(settings, sizeof(settings));
- //
- // //给字符串添加样式attribute
- // [string addAttribute:(id)kCTParagraphStyleAttributeName
- // value:CFBridgingRelease(paragraphStyle1)
- // range:NSMakeRange(0, [string length])];
- //
- // }
- //
- //
- //
- // // CGRect pdfrect=[self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
- // // [string drawInRect:pdfrect];
- //
- //
- // // [self.text drawInRect:pdfrect withAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:40],NSForegroundColorAttributeName : [UIColor redColor]}];
- //
- // // layout master
- // CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);
- // //计算文本绘制size ,这里300是文字宽度,你可以自己更改为247,但是要记得,在height 方法里的这个位置,也改为247
- // CGSize tmpSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0,0), NULL, CGSizeMake(self.rect.size.width-self.margin_left-self.margin_right, MAXFLOAT), NULL);
- // //创建textBoxSize以设置view的frame
- // CGSize textBoxSize = CGSizeMake((int)tmpSize.width + 1, (int)tmpSize.height + 1);
- // // DebugLog(@"textBoxSize0 == %f,%f,%f",textBoxSize.width,textBoxSize.height,textBoxSize.width / textBoxSize.height);
- // // self.frame = CGRectMake(0, 0, textBoxSize.width , textBoxSize.height);
- // // [string release];
- //
- // //- (void)drawRect:(CGRect)rect;代码
- //
- //
- //
- //
- // // CGMutablePathRef leftColumnPath = CGPathCreateMutable();
- //
- // CGRect parentrect = [self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
- //
- //
- // double height =0;
- // if(tmpSize.height<parentrect.size.height)
- // height=tmpSize.height;
- // else
- // if(expand)
- // {
- // height=tmpSize.height;
- // self.rect = CGRectMake(self.rect.origin.x, self.rect.origin.y, self.rect.size.width, height+self.margin_top+self.margin_bottom);
- // }
- // else
- // height=parentrect.size.height;
- //
- // CGRect rect=CGRectMake(parentrect.origin.x, parentrect.origin.y, parentrect.size.width, height);
- //
- // CGRect expand_rect=rect;
- //
- // // CGRect rect=[RAUtils rectAlign:parentrect rect:scalerect hAlign:self.hAlign vAlign:self.vAlign];
- // // rect=[RAUtils rectVAlign:parentrect rect:rect vAlign:self.vAlign];
- // //
- // // // CGRect pdfrect = [self to_pdf_rect:p_rect pos:self.rect contextHeight:flip_height];
- // //
- // // rect= [self parent_to_pdf_rect:rect contextHeight:flip_height];
- // // // pdfrect=CGRectMake(pdfrect.origin.x, flip_height-pdfrect.origin.y, pdfrect.size.width, pdfrect.size.height);
- // // CGPathAddRect(leftColumnPath, NULL,
- // // rect);
- // //
- // // CTFrameRef leftFrame = CTFramesetterCreateFrame(framesetter,
- // // CFRangeMake(0, 0),
- // // leftColumnPath, NULL);
- // //
- // // // DebugLog(@"textBoxSize1 == %f,%f",self.frame.size.width,self.frame.size.height);
- // // // flip the coordinate system
- // // // CGContextRef context = UIGraphicsGetCurrentContext();
- // //
- // //
- // // // CGContextClearRect(context, self.rect);
- // // // CGContextSetFillColorWithColor(context, [[UIColor whiteColor]CGColor]);
- // // // CGContextFillRect(context, CGRectMake(0, 0, self.rect.size.width, self.rect.size.height));
- // //
- // //
- // // CGContextSetTextMatrix(context, CGAffineTransformIdentity);
- // // // CGContextTranslateCTM(context, 0, self.rect.size.height);
- // // // CGContextScaleCTM(context, 1.0, -1.0);
- // //
- // // // draw
- // // CTFrameDraw(leftFrame, context);
- // //
- // //
- // // CFRelease(leftFrame);
- // // // cleanup
- // //
- // // CGPathRelease(leftColumnPath);
- // CFRelease(framesetter);
- //
- //
- // // return self.rect;
- // // [self DrawBound:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
- // if(expand&&expand_rect.size.height>parentrect.size.height)
- // return expand_rect;
- // else
- // return parentrect;
- // // return CGPointMake(parentrect.origin.x+parentrect.size.width, parentrect.origin.y+parentrect.size.height);
- //
- // // [super restoreFlip:context ContextHeight:flip_height];
- // }
- //
- //
- //}
- //-(CTFontRef)CreateFont:(NSString*)name size:(double)size bold:(bool)bold
- //{
- //
- // if(name.length==0)
- // {
- // name=@"Helvetica";
- // // name=@"DejaVu Sans";
- // }
- // if(size==0)
- // {
- // size=10;
- // }
- // NSString* style = @"Regular";
- // if(bold)
- // style=@"Bold";
- //
- // //name=@"Courier";
- //
- // NSDictionary *fontAttributes =
- // [NSDictionary dictionaryWithObjectsAndKeys:
- // name, (NSString *)kCTFontFamilyNameAttribute,
- // style, (NSString *)kCTFontStyleNameAttribute,
- // [NSNumber numberWithFloat:size],
- // (NSString *)kCTFontSizeAttribute,
- // nil];
- // // Create a descriptor.
- // CFDictionaryRef cffontAttributes =(__bridge CFDictionaryRef)fontAttributes;
- // CTFontDescriptorRef descriptor =
- // CTFontDescriptorCreateWithAttributes(cffontAttributes);
- //
- // // CFBridgingRelease(cffontAttributes);
- //
- // // Create a font using the descriptor.
- // CTFontRef font = CTFontCreateWithFontDescriptor(descriptor, 0.0, NULL);
- // CFBridgingRelease(descriptor);
- //
- // return font;
- //
- // // if(bold)
- // // {
- // // CTFontRef font=CTFontCreateWithName((__bridge CFStringRef)name, size, NULL);
- // // CTFontRef font_bold =CTFontCreateCopyWithSymbolicTraits(font, 0.0, NULL, kCTFontBoldTrait, kCTFontBoldTrait);
- // // CFBridgingRelease(font);
- // // return font_bold;
- // // }
- // // return CTFontCreateWithName((__bridge CFStringRef)name, size, NULL);
- //}
- ////-(NSString*) QueryFontName:(NSString*)font
- ////{
- //// if(font==nil)
- //// {
- //// return @"Helvetica";
- //// }
- //// else if([font.lowercaseString isEqualToString:@"kalinga"])
- //// {
- //// return @"kalinga";
- //// }
- //// return @"Helvetica";
- ////}
- //-(NSMutableAttributedString*) richtext2attributedstring:(NSMutableAttributedString*)string font:(NSString*)font size:(double)size bold:(bool)bold
- //{
- // // UILabel* uilabel=[[UILabel alloc]init];
- // // uilabel.font=[UIFont fontWithName:font size:size];
- // // NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[self.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
- // // uilabel.attributedText = attrStr;
- // // DebugLog(@"%@", attrStr);
- // // DebugLog(@"%@", uilabel.attributedText);
- //
- // CTFontRef ctfont = [self CreateFont:font size:size bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);b
- //
- // //CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // // CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // //字体,把helvetica 样式加到整个,string上
- // [string addAttribute:(id)kCTFontAttributeName
- // value:CFBridgingRelease(ctfont)
- // range:NSMakeRange(0, [string length])];
- //
- // //颜色,此处为黑色,你可以自己改颜色,[UIColor redColor]
- // [string addAttribute:(id)kCTForegroundColorAttributeName
- // value:(id)self.textColor.CGColor
- // range:NSMakeRange(0, [string length])];
- //
- //
- // if(!bold)
- // {
- // CTFontRef ctfont_bold = [self CreateFont:font size:size bold:true];
- // NSString* newstring= nil;
- // // NSString *content = string.string ;
- // NSString *pattern = @"\\<b\\>([\\s\\S]*?)\\<\\/b\\>";
- // // NSArray* matches=[TextUtils expression_varable:content regex:pattern];
- // // if (matches) {
- // // for (NSTextCheckingResult *match in matches) {
- // // for (int i = 0; i < match.numberOfRanges; ++i) {
- // // DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // // }
- // // }
- // // }
- // NSTextCheckingResult * match=[TextUtils expression_findfistMatch:string.string regex:pattern];
- //
- // while(match)
- // {
- // //for (int i = 0; i < match.numberOfRanges/2; ++i)
- // {
- // int i=0;
- // DebugLog(@"%d->range with richtext label: %d,%d",i, [match rangeAtIndex:i].location,[match rangeAtIndex:i].length);
- // DebugLog(@"%d-> range of text: %d,%d ",i+1, [match rangeAtIndex:i+1].location,[match rangeAtIndex:i+1].length);
- //
- //
- // DebugLog(@"string length: %d",string.string.length);
- // [string addAttribute:(id)kCTFontAttributeName
- // value:(__bridge id _Nonnull)(ctfont_bold)
- // range:[match rangeAtIndex:i+1]];
- //
- // [string replaceCharactersInRange:NSMakeRange([match rangeAtIndex:i+1].location+[match rangeAtIndex:i+1].length, [match rangeAtIndex:i].location+[match rangeAtIndex:i].length-([match rangeAtIndex:i+1].location+[match rangeAtIndex:i+1].length)) withString:@""];
- // [string replaceCharactersInRange:NSMakeRange([match rangeAtIndex:i].location, [match rangeAtIndex:i+1].location-[match rangeAtIndex:i].location) withString:@""];
- //
- // DebugLog(@"string after replace: %@",string.string);
- // //newstring=[newstring stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[content substringWithRange:[match rangeAtIndex:i+1]]];
- // match=[TextUtils expression_findfistMatch:string.string regex:pattern];
- // }
- // }
- // // if (matches)
- // // {
- // // newstring=content;
- // // for (NSTextCheckingResult *match in matches)
- // // {
- // //
- // // for (int i = 0; i < match.numberOfRanges/2; ++i)
- // // {
- // // DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // // DebugLog(@"%d-> %@",i+1, [content substringWithRange:[match rangeAtIndex:i+1]]);
- // //
- // // [string addAttribute:(id)kCTFontAttributeName
- // // value:CFBridgingRelease(ctfont_bold)
- // // range:[match rangeAtIndex:i+1]];
- // //
- // // newstring=[newstring stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[content substringWithRange:[match rangeAtIndex:i+1]]];
- // //
- // // }
- // // }
- // // }
- //
- //
- //
- // CFBridgingRelease(ctfont_bold);
- // }
- //
- //
- // return string;
- //}
- //-(CGRect) Draw:(CGContextRef) context dataSource:(NSMutableDictionary*)data ParentRect:(CGRect)p_rect startX:(double) x startY:(double) y flipHeight:(double)flip_height range:(NSRange)between_header_and_footer
- //{
- //
- //
- //
- //
- // NSString * source=self.drawableTemplate[@"source_type"];
- // if(source==nil)
- // source=@"const";
- // if([source isEqualToString:@"const"])
- // {
- // self.text=self.drawableTemplate[@"text"];
- // // self.text=[self.text stringByReplacingOccurrencesOfString:@"\r\n" withString:@"<br>"];
- //
- // }
- // else if([source isEqualToString:@"data"])
- // {
- // if([self.drawableTemplate[@"source_isexpression"] boolValue])
- // {
- // NSString *content = data[self.drawableTemplate[@"source"]];
- // NSString *pattern = @"\\$\\.\\{([\\s\\S]*?)\\}\\.\\$";
- // NSArray* matches=[TextUtils expression_varable:content regex:pattern];
- // // if (matches) {
- // // for (NSTextCheckingResult *match in matches) {
- // // for (int i = 0; i < match.numberOfRanges; ++i) {
- // // DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // // }
- // // }
- // // }
- // if (matches)
- // {
- // self.text=content;
- // for (NSTextCheckingResult *match in matches)
- // {
- //
- // for (int i = 0; i < match.numberOfRanges/2; ++i) {
- // DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // DebugLog(@"%d-> %@",i+1, [content substringWithRange:[match rangeAtIndex:i+1]]);
- //
- // self.text=[self.text stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[NSString stringWithFormat:@"%@",data[[content substringWithRange:[match rangeAtIndex:i+1]]]]];
- // }
- // }
- // }
- // //self.text=content;
- //
- // }
- // else
- // {
- // self.text=data[self.drawableTemplate[@"source"]];
- // }
- // }
- //
- // if(self.text==nil)
- // self.text=@"";
- //
- //
- //
- //
- //
- //// if([self.text isEqualToString:@"www.newpacificdirect.com"])
- //// {
- //// int debug=0;
- //// }
- //
- //
- // bool bold = [self.drawableTemplate[@"bold"] boolValue];
- // bool italic = [self.drawableTemplate[@"italic"] boolValue];
- // NSString* font=self.drawableTemplate[@"font"];
- //
- // // [super flipContext:context ContextHeight:flip_height];
- // // super flipContext:context ContextHeight:<#(double)#>
- // CGFloat fontsize = [self.drawableTemplate[@"size"] doubleValue];
- //
- // //NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[title dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
- // //创建AttributeStringfdsa
- //
- // NSMutableAttributedString *string = nil;
- // // if([self.drawableTemplate[@"ishtml"] boolValue])
- // // {
- // // string=[[[NSAttributedString alloc] initWithData:[self.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil] mutableCopy];
- // //
- // // }
- // // else
- //
- // string=[[NSMutableAttributedString alloc] initWithString:self.text];
- // //创建字体以及字体大小
- // // CTFontRef ctfont = [self CreateFont:font size:fontsize bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // // // CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
- // // //字体,把helvetica 样式加到整个,string上
- // // [string addAttribute:(id)kCTFontAttributeName
- // // value:CFBridgingRelease(ctfont)
- // // range:NSMakeRange(0, [string length])];
- // //
- // // //字体样式 ,把helveticaBold 样式加到整个,string上
- // // // [string addAttribute:(id)kCTFontAttributeName
- // // // value:CFBridgingRelease(helveticaBold)
- // // // range:NSMakeRange(0, [string length])];
- // //
- // // //颜色,此处为黑色,你可以自己改颜色,[UIColor redColor]
- // // [string addAttribute:(id)kCTForegroundColorAttributeName
- // // value:(id)self.textColor.CGColor
- // // range:NSMakeRange(0, [string length])];
- //
- // string = [self richtext2attributedstring:string font:font size:fontsize bold:bold];
- //
- //
- // //设置字体间距
- // long number = self.characterSpace;
- // CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
- // [string addAttribute:(id)kCTKernAttributeName value:CFBridgingRelease(num) range:NSMakeRange(0, [string length])];
- // //CFRelease(num);
- //
- //
- // //创建文本对齐方式
- // CTTextAlignment alignment = self.textalignment;//对齐方
- // CTParagraphStyleSetting alignmentStyle;
- // alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;
- // alignmentStyle.valueSize=sizeof(alignment);
- // alignmentStyle.value=&alignment;
- //
- // //创建文本, 行间距
- // CGFloat lineSpace=self.lineSpace;//间距数据
- // CTParagraphStyleSetting lineSpaceStyle;
- // lineSpaceStyle.spec=kCTParagraphStyleSpecifierLineSpacing;
- // lineSpaceStyle.valueSize=sizeof(lineSpace);
- // lineSpaceStyle.value=&lineSpace;
- //
- // //设置 line break;
- // CTLineBreakMode linebreakmode = kCTLineBreakByTruncatingTail;
- // CTParagraphStyleSetting linebreakStyle;
- // linebreakStyle.spec = kCTParagraphStyleSpecifierLineBreakMode;
- // linebreakStyle.valueSize = sizeof(CGFloat);
- // linebreakStyle.value = &linebreakmode;
- //
- //
- // //设置 段落间距
- // CGFloat paragraph = self.paragraphSpace;
- // CTParagraphStyleSetting paragraphStylesetting;
- // paragraphStylesetting.spec = kCTParagraphStyleSpecifierParagraphSpacing;
- // paragraphStylesetting.valueSize = sizeof(CGFloat);
- // paragraphStylesetting.value = ¶graph;
- //
- //
- //
- //
- // //创建样式数组
- // CTParagraphStyleSetting settings[]={
- // alignmentStyle,lineSpaceStyle,paragraphStylesetting,linebreakStyle
- // };
- //
- // //设置样式
- // CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, sizeof(settings));
- //
- // //给字符串添加样式attribute
- // [string addAttribute:(id)kCTParagraphStyleAttributeName
- // value:CFBridgingRelease(paragraphStyle)
- // range:NSMakeRange(0, [string length])];
- //
- //
- //
- //
- //
- // // CGRect pdfrect=[self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
- // // [string drawInRect:pdfrect];
- //
- //
- // // [self.text drawInRect:pdfrect withAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:40],NSForegroundColorAttributeName : [UIColor redColor]}];
- //
- // // layout master
- // CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);
- // //计算文本绘制size ,这里300是文字宽度,你可以自己更改为247,但是要记得,在height 方法里的这个位置,也改为247
- // CGSize tmpSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0,0), NULL, CGSizeMake(self.rect.size.width-self.margin_left-self.margin_right, MAXFLOAT), NULL);
- // //创建textBoxSize以设置view的frame
- // CGSize textBoxSize = CGSizeMake((int)tmpSize.width + 1, (int)tmpSize.height + 1);
- // // DebugLog(@"textBoxSize0 == %f,%f,%f",textBoxSize.width,textBoxSize.height,textBoxSize.width / textBoxSize.height);
- // // self.frame = CGRectMake(0, 0, textBoxSize.width , textBoxSize.height);
- // // [string release];
- //
- // //- (void)drawRect:(CGRect)rect;代码
- //
- //
- //
- //
- // CGMutablePathRef leftColumnPath = CGPathCreateMutable();
- //
- // CGRect parentrect = [self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
- //
- // bool expand=[self.drawableTemplate[@"expand"] boolValue];
- // double height =0;
- // if(tmpSize.height<parentrect.size.height)
- // height=tmpSize.height;
- // else
- // if(expand)
- // {
- // height=tmpSize.height;
- // self.rect = CGRectMake(self.rect.origin.x, self.rect.origin.y, self.rect.size.width, height+self.margin_top+self.margin_bottom);
- // }
- // else
- // height=parentrect.size.height;
- //
- // CGRect rect=CGRectMake(parentrect.origin.x, parentrect.origin.y, parentrect.size.width, height);
- //
- // CGRect expand_rect=rect;
- //
- // // CGRect rect=[RAUtils rectAlign:parentrect rect:scalerect hAlign:self.hAlign vAlign:self.vAlign];
- // rect=[TextUtils rectVAlign:parentrect rect:rect vAlign:self.vAlign];
- //
- // // CGRect pdfrect = [self to_pdf_rect:p_rect pos:self.rect contextHeight:flip_height];
- //
- // rect= [self parent_to_pdf_rect:rect contextHeight:flip_height];
- // // pdfrect=CGRectMake(pdfrect.origin.x, flip_height-pdfrect.origin.y, pdfrect.size.width, pdfrect.size.height);
- // CGPathAddRect(leftColumnPath, NULL,
- // rect);
- //
- // CTFrameRef leftFrame = CTFramesetterCreateFrame(framesetter,
- // CFRangeMake(0, 0),
- // leftColumnPath, NULL);
- //
- // // DebugLog(@"textBoxSize1 == %f,%f",self.frame.size.width,self.frame.size.height);
- // // flip the coordinate system
- // // CGContextRef context = UIGraphicsGetCurrentContext();
- //
- //
- // // CGContextClearRect(context, self.rect);
- // // CGContextSetFillColorWithColor(context, [[UIColor whiteColor]CGColor]);
- // // CGContextFillRect(context, CGRectMake(0, 0, self.rect.size.width, self.rect.size.height));
- //
- //
- // CGContextSetTextMatrix(context, CGAffineTransformIdentity);
- // // CGContextTranslateCTM(context, 0, self.rect.size.height);
- // // CGContextScaleCTM(context, 1.0, -1.0);
- //
- // // draw
- // CTFrameDraw(leftFrame, context);
- //
- //
- // CFRelease(leftFrame);
- // // cleanup
- //
- // CGPathRelease(leftColumnPath);
- // CFRelease(framesetter);
- //
- //
- // // return self.rect;
- // [self DrawBound:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
- // if(expand&&expand_rect.size.height>parentrect.size.height)
- // return expand_rect;
- // else
- // return parentrect;
- // // return CGPointMake(parentrect.origin.x+parentrect.size.width, parentrect.origin.y+parentrect.size.height);
- //
- // // [super restoreFlip:context ContextHeight:flip_height];
- //}
- //
- //
- //@end
|