| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 |
- //
- // 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 "RAUtils.h"
- @implementation TextDrawable
- -(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;
- }
-
-
-
-
- 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
- {
- CGRect parentrect = [self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
-
- return parentrect;
- }
- -(CTFontRef)CreateFont:(NSString*)name size:(double)size bold:(bool)bold
- {
-
- if(name==nil)
- {
- 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.
- CTFontDescriptorRef descriptor =
- CTFontDescriptorCreateWithAttributes((CFDictionaryRef)fontAttributes);
-
- // Create a font using the descriptor.
- CTFontRef font = CTFontCreateWithFontDescriptor(descriptor, 0.0, NULL);
- CFRelease(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;
- // NSLog(@"%@", attrStr);
- // NSLog(@"%@", uilabel.attributedText);
-
- CTFontRef ctfont = [self CreateFont:font size:size bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);b
-
- CTFontRef ctfont_bold = [self CreateFont:font size:size bold:true];//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)
- {
- NSString* newstring= nil;
- // NSString *content = string.string ;
- NSString *pattern = @"\\<b\\>([\\s\\S]*?)\\<\\/b\\>";
- // NSArray* matches=[RAUtils expression_varable:content regex:pattern];
- // if (matches) {
- // for (NSTextCheckingResult *match in matches) {
- // for (int i = 0; i < match.numberOfRanges; ++i) {
- // NSLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // }
- // }
- // }
- NSTextCheckingResult * match=[RAUtils expression_findfistMatch:string.string regex:pattern];
-
- while(match)
- {
- //for (int i = 0; i < match.numberOfRanges/2; ++i)
- {
- int i=0;
- NSLog(@"%d->range with richtext label: %d,%d",i, [match rangeAtIndex:i].location,[match rangeAtIndex:i].length);
- NSLog(@"%d-> range of text: %d,%d ",i+1, [match rangeAtIndex:i+1].location,[match rangeAtIndex:i+1].length);
-
-
- NSLog(@"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:@""];
- NSLog(@"string after replace: %@",string.string);
- //newstring=[newstring stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[content substringWithRange:[match rangeAtIndex:i+1]]];
- match=[RAUtils expression_findfistMatch:string.string regex:pattern];
- }
- }
- // if (matches)
- // {
- // newstring=content;
- // for (NSTextCheckingResult *match in matches)
- // {
- //
- // for (int i = 0; i < match.numberOfRanges/2; ++i)
- // {
- // NSLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- // NSLog(@"%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"];
-
- }
- else if([source isEqualToString:@"data"])
- {
- if([self.drawableTemplate[@"source_isexpression"] boolValue])
- {
- NSString *content = data[self.drawableTemplate[@"source"]];
- NSString *pattern = @"\\$\\.\\{([\\s\\S]*?)\\}\\.\\$";
- NSArray* matches=[RAUtils expression_varable:content regex:pattern];
- // if (matches) {
- // for (NSTextCheckingResult *match in matches) {
- // for (int i = 0; i < match.numberOfRanges; ++i) {
- // NSLog(@"%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) {
- NSLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
- NSLog(@"%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:@"Special: $ 185.00"])
- // {
- // 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:(id)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);
- // NSLog(@"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];
-
-
- CGRect rect=CGRectMake(parentrect.origin.x, parentrect.origin.y, parentrect.size.width, /*tmpSize.height*/parentrect.size.height);
-
- // 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);
-
- // NSLog(@"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);
-
- // cleanup
-
- CGPathRelease(leftColumnPath);
- CFRelease(framesetter);
-
- [self DrawBound:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
- return parentrect;
- // return CGPointMake(parentrect.origin.x+parentrect.size.width, parentrect.origin.y+parentrect.size.height);
-
- // [super restoreFlip:context ContextHeight:flip_height];
- }
- @end
|