您现在的位置是:主页 > news > 没有网站怎么做cpa赚钱/网页开发需要学什么

没有网站怎么做cpa赚钱/网页开发需要学什么

admin2025/4/27 4:22:13news

简介没有网站怎么做cpa赚钱,网页开发需要学什么,用云怎么做网站,淮北网站三合一建设公司边框(Bounding Box):一个假想的边框,尽可能地容纳整个字形。 基线(Baseline):一条假想的参照线,以此为基础进行字形的渲染。一般来说是一条横线。 基础原点(Origin):基线上最左侧的点。 行间距(Leading)&#xff1a…

没有网站怎么做cpa赚钱,网页开发需要学什么,用云怎么做网站,淮北网站三合一建设公司边框(Bounding Box):一个假想的边框,尽可能地容纳整个字形。 基线(Baseline):一条假想的参照线,以此为基础进行字形的渲染。一般来说是一条横线。 基础原点(Origin):基线上最左侧的点。 行间距(Leading)&#xff1a…

  • 边框(Bounding Box):一个假想的边框,尽可能地容纳整个字形。

  • 基线(Baseline):一条假想的参照线,以此为基础进行字形的渲染。一般来说是一条横线。

  • 基础原点(Origin):基线上最左侧的点。

  • 行间距(Leading):行与行之间的间距。

  • 字间距(Kerning):字与字之间的距离,为了排版的美观,并不是所有的字形之间的距离都是一致的,但是这个基本步影响到我们的文字排版。

  • 上行高度(Ascent)和下行高度(Decent):一个字形最高点和最低点到基线的距离,前者为正数,而后者为负数。当同一行内有不同字体的文字时,就取最大值作为相应的值。

  • 在CTFrame内部,是由多个CTLine来组成的,每个CTLine代表一行,每个CTLine又是由多个CTRun来组成,每个CTRun代表一组显示风格一致的文本。我们不用手工管理CTLine和CTRun的创建过程。

0.CoreText 简介

  • CoreText 是用于处理文字和字体的底层技术。它直接和 Core Graphics(又被称为 Quartz)打交道。Quartz 是一个 2D 图形渲染引擎,能够处理 OSX 和 iOS 中的图形显示。 Quartz 能够直接处理字体(font)和字形(glyphs),将文字渲染到界面上,它是基础库中唯一能够处理字形的模块。因此,CoreText 为了排版,需要将显示的文本内容、位置、字体、字形直接传递给 Quartz。相比其它 UI 组件,由于 CoreText 直接和 Quartz 来交互,所以它具有高速的排版效果。 CoreText 处于非常底层的位置,上层的 UI 控件(包括 UILabel,UITextField 以及 UITextView)和 UIWebView 都是基于 CoreText 来实现的。

1.CoreText实现简单的文字绘制

#import "JQView.h"
#import <CoreText/CoreText.h>@implementation JQView- (void)drawRect:(CGRect)rect {[super drawRect:rect];// 1.获取当前绘制上下文CGContextRef context = UIGraphicsGetCurrentContext();// 2.让坐标系的上下翻转CGContextSetTextMatrix(context, CGAffineTransformIdentity);//设置字形的变换矩阵为不做图形变换CGContextTranslateCTM(context, 0, self.bounds.size.height);//平移方法,将画布向上平移一个屏幕高CGContextScaleCTM(context, 1.0, -1.0);//缩放方法,x轴缩放系数为1,则不变,y轴缩放系数为-1,则相当于以x轴为轴旋转180度// 3.绘制内容显示区域CGMutablePathRef path = CGPathCreateMutable();CGPathAddRect(path, NULL, self.bounds);// 4.绘制文字NSAttributedString *attString = [[NSAttributedString alloc] initWithString:@"我是一个测试"];CTFramesetterRef framesetter =CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attString);CTFrameRef frame =CTFramesetterCreateFrame(framesetter,CFRangeMake(0, [attString length]), path, NULL);CTFrameDraw(frame, context);// 5.释放CFRelease(frame);CFRelease(path);CFRelease(framesetter);
}
@end
复制代码
#pragma mark ---根据frame返回图片绘制的区域---
-(void)handleActiveRectWithFrame:(CTFrameRef)frame
{NSArray * arrLines = (NSArray *)CTFrameGetLines(frame);//根据frame获取需要绘制的线的数组NSInteger count = [arrLines count];//获取线的数量CGPoint points[count];//建立起点的数组(cgpoint类型为结构体,故用C语言的数组)CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), points);//获取起点for (int i = 0; i < count; i ++) {//遍历线的数组CTLineRef line = (__bridge CTLineRef)arrLines[i];NSArray * arrGlyphRun = (NSArray *)CTLineGetGlyphRuns(line);//获取GlyphRun数组(GlyphRun:高效的字符绘制方案)for (int j = 0; j < arrGlyphRun.count; j ++) {//遍历CTRun数组CTRunRef run = (__bridge CTRunRef)arrGlyphRun[j];//获取CTRunNSDictionary * attributes = (NSDictionary *)CTRunGetAttributes(run);//获取CTRun的属性CTRunDelegateRef delegate = (__bridge CTRunDelegateRef)[attributes valueForKey:(id)kCTRunDelegateAttributeName];//获取代理CGPoint point = points[i];//获取一个起点if (delegate == nil) {//判断是否图片,不是图片判断是否活跃文字NSString * string = attributes[@"click"];if (string) {[arrText addObject:[NSValue valueWithCGRect:[self getLocWithFrame:frame CTLine:line CTRun:run origin:point]]];}continue;}NSDictionary * metaDic = CTRunDelegateGetRefCon(delegate);//判断代理字典if (![metaDic isKindOfClass:[NSDictionary class]]) {continue;}_imgFrm = [self getLocWithFrame:frame CTLine:line CTRun:run origin:point];//获取绘制区域;}}
}-(CGRect)getLocWithFrame:(CTFrameRef)frame CTLine:(CTLineRef)line CTRun:(CTRunRef)run origin:(CGPoint)origin
{CGFloat ascent;//获取上距CGFloat descent;//获取下距CGRect boundsRun;//创建一个frameboundsRun.size.width = CTRunGetTypographicBounds(run, CFRangeMake(0, 0), &ascent, &descent, NULL);boundsRun.size.height = ascent + descent;CGFloat xOffset = CTLineGetOffsetForStringIndex(line, CTRunGetStringRange(run).location, NULL);//获取x偏移量boundsRun.origin.x = origin.x + xOffset;//point是行起点位置,加上每个字的偏移量得到每个字的xboundsRun.origin.y = origin.y - descent;CGPathRef path = CTFrameGetPath(frame);//获取绘制区域CGRect colRect = CGPathGetBoundingBox(path);//获取剪裁区域边框CGRect deleteBounds = CGRectOffset(boundsRun, colRect.origin.x, colRect.origin.y);//获取绘制区域return deleteBounds;
}
复制代码