我们知道图层也好,视图也罢,我们在使用时,它总是以某一形状出现,这便是图层的几何,这里我来简单说下图层几何这一章的学习过程。
1.布局
在UIView中有frame,bounds和center,而在CALayer中有frame,bounds和position,他们是一一相对的,bounds和center(position)决定了frame,所以frame是一个虚拟的东西,是由后两者算出来的,他们彼此相互依赖,只要改变了bounds或者center(position)中的任何一个值,frame 就会被改变,需要注意的是,对图层进行变换,特别是旋转的时候,frame的值随时都在变化,为四个角做垂直切线形成的新的矩形区域,最初的“frame”则是小于并存在于新的frame里面的。
这里借用书中的图来说明frame变化这一现象。
2.锚(mao)点(抛锚的mao)
锚点(anchorPoint)位于图层的中心,默认为{0.5,0.5},图层左上角为{0,0},右下角为{1,1},它的作用是用于保持平衡,我们把锚点比作一个跷跷板的支点,当把锚点向一侧移动时,另一边肯定由于重心偏离支点而向锚点移动的相反的方向倾斜,就是这个原理,当改变图层的锚点时,图层总是向对称的相反的方向移动锚点变化的距离。
如图所示,锚点就是这么的神奇。这里有一个时钟表针位置的变化,因为书中的内容相对来说老了点,所以代码在现在的Xcode中运行是有问题的,尤其需要注意这几段代码:
//定义一个遵循某个历法的日历对象 NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; //通过已定义的日历对象,获取某个时间点的NSDateComponents表示,并设置需要表示哪些信息 NSDateComponents *dateComponents = [greCalendar components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:[NSDate date]]; float hoursAngle=(dateComponents.hour%12*1.0/12)*M_PI*2+dateComponents.minute*1.0/60.0*(M_PI/6); float minutesAngle=(dateComponents.minute*1.0/60)*M_PI*2; float secondsAngle=(dateComponents.second*1.0/60)*M_PI*2;
旧的方法Xcode会报错,这里博主用了新的方法,同时,不知道什么原因,下面这段代码
CGFloat hoursAngle = (components.hour / 12.0) * M_PI * 2.0; //calculate hour hand angle //calculate minute hand angle CGFloat minsAngle = (components.minute / 60.0) * M_PI * 2.0; //calculate second hand angle CGFloat secsAngle = (components.second / 60.0) * M_PI * 2.0;
这么写是有问题的,因为components.hour这些参数是%i的类型,%i实际上就是%d了,除以一个整数得到的还是一个整数,时钟是不会动的,所以这里要变成一个浮点数,乘以1.0就可以了,类似的还有在下载时算下载文件大小的ll(大写LL)类型,直接进行运算都是会出问题的,需要乘以1.0,再进行运算,书中的方法还有一个缺陷就是时针一直指向整数小时,所以这里博主利用分针的位置改进了下代码。博主在学习时自己找乐资源做了下,代码下载代码地址:这里写链接内容,大家自己尝试。