服务器之家

服务器之家 > 正文

iOS坐标系的深入探究

时间:2021-05-17 16:33     来源/作者:落影loyinglin

前言

app在渲染视图时,需要在坐标系中指定绘制区域。

这个概念看似乎简单,事实并非如此。

when an app draws something in ios, it has to locate the drawn content in a two-dimensional space defined by a coordinate system.
this notion might seem straightforward at first glance, but it isn't.

正文

我们先从一段最简单的代码入手,在drawrect中显示一个普通的uilabel;

为了方便判断,我把整个view的背景设置成黑色:

?
1
2
3
4
5
6
7
8
9
10
- (void)drawrect:(cgrect)rect {
 [super drawrect:rect];
 cgcontextref context = uigraphicsgetcurrentcontext();
 nslog(@"cgcontext default ctm matrix %@", nsstringfromcgaffinetransform(cgcontextgetctm(context)));
 uilabel *testlabel = [[uilabel alloc] initwithframe:cgrectmake(0, 0, 100, 28)];
 testlabel.text = @"测试文本";
 testlabel.font = [uifont systemfontofsize:14];
 testlabel.textcolor = [uicolor whitecolor];
 [testlabel.layer renderincontext:context];
}

这段代码首先创建一个uilabel,然后设置文本,显示到屏幕上,没有修改坐标。

所以按照uilabel.layer默认的坐标(0, 0),在左上角进行了绘制。

iOS坐标系的深入探究

uilabel绘制

接着,我们尝试使用coretext来渲染一段文本。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
- (void)drawrect:(cgrect)rect {
 [super drawrect:rect];
 cgcontextref context = uigraphicsgetcurrentcontext();
 nslog(@"cgcontext default matrix %@", nsstringfromcgaffinetransform(cgcontextgetctm(context)));
 nsattributedstring *attrstr = [[nsattributedstring alloc] initwithstring:@"测试文本" attributes:@{
             nsforegroundcolorattributename:[uicolor whitecolor],
             nsfontattributename:[uifont systemfontofsize:14],
             }];
 ctframesetterref framesetter = ctframesettercreatewithattributedstring((__bridge cfattributedstringref) attrstr); // 根据富文本创建排版类ctframesetterref
 uibezierpath * bezierpath = [uibezierpath bezierpathwithrect:cgrectmake(0, 0, 100, 20)];
 ctframeref frameref = ctframesettercreateframe(framesetter, cfrangemake(0, 0), bezierpath.cgpath, null); // 创建排版数据
 ctframedraw(frameref, context);
}

首先用nsstring创建一个富文本,然后根据富文本创建ctframesetterref,结合cgrect生成的uibezierpath,我们得到ctframeref,最终渲染到屏幕上。

但是结果与上文不一致:文字是上下颠倒。

iOS坐标系的深入探究
coretext的文本绘制

从这个不同的现象开始,我们来理解ios的坐标系。

坐标系概念

在ios中绘制图形必须在一个二维的坐标系中进行,但在ios系统中存在多个坐标系,常需要处理一些坐标系的转换。
先介绍一个图形上下文(graphics context)的概念,比如说我们常用的cgcontext就是quartz 2d的上下文。图形上下文包含绘制所需的信息,比如颜色、线宽、字体等。用我们在windows常用的画图来参考,当我们使用画笔

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部