小记:
作为一只菜鸡,每每有问题,第一时间都会想着去问问度娘,找找之前的前辈的手札来学习,但是有时候,在学习时给自己几分钟追根究底却很有意思!
正文:
当我将一个view的frame和bounds设置不同的时候模拟器跑出了很有意思的结果,如下:
原始:frame(100,100,200,200) bounds(0,0,500,500)
结果:frame(-50,-50,500,500) bounds(0,0,500,500)
其中变化了两个点:1.大小,2.坐标
大小的变化好理解,bounds是对自身的设置,frame是相对父视图的设置,所以,最终大小是由bounds来决定,当然如果没有bounds设置,frame就决定了大小.
那么坐标为什么变的这么畸形呢?网上稍微百度,靠前的答案并没有给出解释,只是说bounds会对frame的坐标和大小会有影响,但是影响从何而来,并不得而知.
我换了几组数据来总结规律;
原始:frame(100,100,200,200) bounds(0,0,250,250)
结果:frame(75,75,250,250) bounds(0,0,250,250)
没感觉.再来!
原始:frame(100,100,500,500) bounds(0,0,200,200)
结果:frame(250,250,200,200) bounds(0,0,200,200)
有点意思了,我决定再来一组.
原始:frame(100,100,250,250) bounds(0,0,200,200)
结果:frame(125,125,200,200) bounds(0,0,200,200)
其实数据只为求证而用,我写这么多,是觉得有疑问的可以自己试试;那么思路来了!既然位置变了,那么决定位置的因子或是因素是什么呢?frame中有一个center的概念,center 是相对父视图的位置;而这个center也许就是决定位置的关键.
我们不妨这样理解,本来frame的center在(0,0),现在size变化了,而center没变.那么坐标不就变化了吗?
那么我们来计算一下是不是center的原因;我拿其中一组举例:
原始:frame(100,100,200,200) bounds(0,0,500,500)
结果:frame(-50,-50,500,500) bounds(0,0,500,500)
frame的center的坐标是(100 + 200 / 2,100 + 200/2)即(200,200),现在size改变了,如果中心点没变,那么
frame.origin,x = 200 - 500 / 2 = 中心x - width/2 = -50
frame.origin.y = 200 - 500 / 2 = 中心y - height/2 = -50
刚好是frame与bounds大小不一时,位置发生变化后的数据;为了证明它,我于是又多算了其他的数据,发现都是如此.
于是我们可以得到以下结论:当frame和bounds不一样的时候,对象的size由bounds决定,而对象的位置由frame的center位置和变化后的size算出.