// // TextDrawable.m // pdftest // // Created by Ray on 10/12/16. // Copyright © 2016 United Software Applications, Inc. All rights reserved. // #import "TextDrawable.h" #import "const.h" #import #import "TextUtils.h" #define DEBUG_STRING_VALUE0 @"DEBUG OFF" #define DEBUG_STRING_VALUE1 @"DEBUG OFF" @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 { DebugLog(@"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"]; DebugLog(@"setDrawableTemplate text align : %@",align); if(align.length==0 || [align.lowercaseString isEqualToString:@"left"]) { self.textalignment= NSTextAlignmentLeft; } else if([align.lowercaseString isEqualToString:@"right"]) { self.textalignment= NSTextAlignmentRight; } else if([align.lowercaseString isEqualToString:@"center"]) { self.textalignment= NSTextAlignmentCenter; } else { self.textalignment= NSTextAlignmentLeft; } 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 { // return p_rect; 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:@"
"]; } 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:(__bridge NSNumber*)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/*,linebreakStyle,lineSpaceStyle,paragraphStyle*/ // }; // // //设置样式 // CTParagraphStyleRef paragraphStyle1 = CTParagraphStyleCreate(settings, sizeof(settings)); // // //给字符串添加样式attribute // [string addAttribute:(id)kCTParagraphStyleAttributeName // value:(__bridge id)paragraphStyle1 // range:NSMakeRange(0, [string length])]; // CFRelease(paragraphStyle1); NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [style setAlignment:self.textalignment]; //[style setLineBreakMode:NSLineBreakByTruncatingTail]; [style setLineBreakMode:NSLineBreakByWordWrapping]; [string addAttribute:NSParagraphStyleAttributeName value:style 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.heightparentrect.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]; } } -(UIFont*)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, UIFontDescriptorFamilyAttribute, // style, UIFontDescriptorTextStyleAttribute, [NSNumber numberWithFloat:size], UIFontDescriptorSizeAttribute, nil]; UIFontDescriptor* fontdescriptor=[UIFontDescriptor fontDescriptorWithFontAttributes:fontAttributes]; if(bold) fontdescriptor = [fontdescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; UIFont * font = [UIFont fontWithDescriptor:fontdescriptor size:0.0]; return font; // // // 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); // 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; // DebugLog(@"%@", attrStr); // DebugLog(@"%@", uilabel.attributedText); // CTFontRef ctfont = [self CreateFont:font size:size bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);b UIFont* uifont =[self CreateFont:font size:size bold:bold]; //CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL); // CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL); //字体,把helvetica 样式加到整个,string上 [string addAttribute:NSFontAttributeName value:uifont range:NSMakeRange(0, [string length])]; // CFRelease(ctfont); //颜色,此处为黑色,你可以自己改颜色,[UIColor redColor] [string addAttribute:NSForegroundColorAttributeName value:self.textColor range:NSMakeRange(0, [string length])]; if(!bold) { // NSString* newstring= nil; // NSString *content = string.string ; NSString *pattern = @"\\([\\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]; UIFont* uifontbold = [self CreateFont:font size:size bold:true]; while(match) { //for (int i = 0; i < match.numberOfRanges/2; ++i) { int i=0; DebugLog(@"%d->range with richtext label: %lu,%lu",i, (unsigned long)[match rangeAtIndex:i].location,(unsigned long)[match rangeAtIndex:i].length); DebugLog(@"%d-> range of text: %lu,%lu ",i+1, (unsigned long)[match rangeAtIndex:i+1].location,(unsigned long)[match rangeAtIndex:i+1].length); DebugLog(@"string length: %lu",(unsigned long)string.string.length); // CTFontRef ctfont_bold = [self CreateFont:font size:size bold:true]; [string addAttribute:NSFontAttributeName value:uifontbold 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]]]; // // } // } // } // CFRelease(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:@"
"]; } 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:DEBUG_STRING_VALUE0]) { self.text =DEBUG_STRING_VALUE1; } // 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(CTTextAlignment); // 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:NSParagraphStyleAttributeName // value:(__bridge id)(paragraphStyle) // range:NSMakeRange(0, [string length])]; // CFRelease(paragraphStyle); NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [style setAlignment:self.textalignment]; // [style setLineBreakMode:NSLineBreakByTruncatingTail]; [style setLineBreakMode:NSLineBreakByWordWrapping]; // style SETLINE [string addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, [string length])]; if([self.text isEqualToString:DEBUG_STRING_VALUE1]) { // bool debug=true; DebugLog(@"textdrawable text:%@",self.text); DebugLog(@"string %@",string); // DebugLog(@"compute size %@", NSStringFromCGSize(CGSizeMake(self.rect.size.width-self.margin_left-self.margin_right, MAXFLOAT)) ); // DebugLog(@"tmpSize %@", NSStringFromCGSize(tmpSize) ); // DebugLog(@"p_rect %@", NSStringFromCGRect(p_rect) ); // DebugLog(@"self.rect %@", NSStringFromCGRect(self.rect) ); } // 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((__bridge 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.heightparentrect.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 //#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:@"
"]; // // } // 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.heightparentrect.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 = @"\\([\\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:@"
"]; // // } // 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.heightparentrect.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