上節(jié)主要說(shuō)了,bounds和frame的定義,可能很抽象;這節(jié)主要介紹下,bounds和frame的使用方法和運(yùn)行效果.
ps:控件中的偏移是以原始狀態(tài)參考的,橘黃色View是暫時(shí)虛擬出來(lái)的;
如下圖所示,有個(gè)自定義坐標(biāo)系(x,y),紅色view(redView),控件(switch),還有個(gè)半透明的橘黃色View(為redView的內(nèi)容View,在未偏移時(shí),是和紅色redView重合的,因此先隱藏起來(lái))
當(dāng)我們需要改變r(jià)edView的位置時(shí),我們習(xí)慣性的就是改變frame,這個(gè)是沒(méi)錯(cuò)的,因?yàn)閒rame是相對(duì)父類(lèi)坐標(biāo)系偏移的.下圖是redView偏移(30,30)后的效果圖,可以清楚的看到橘黃的view到現(xiàn)在還沒(méi)有偏移.這是因?yàn)殚冱S的view是redView的內(nèi)容View(包括開(kāi)關(guān)控件),是跟著Frame一起變化的.
//執(zhí)行如下代碼
CGRect frame = self.redView.frame;
frame.origin.y = 30;
frame.origin.x = 30;
self.redView.frame = frame;
如果我改變r(jià)edView的bounds會(huì)有什么效果了?如下圖所示,為改變bounds后的效果:
//執(zhí)行如下代碼
CGRect bounds = self.redView.bounds;
bounds.origin.y = -30;
bounds.origin.x = -30;
self.redView.bounds = bounds;
至此可以清楚的看到redView內(nèi)容View已經(jīng)偏移了,而其上的開(kāi)關(guān)控件也隨之一起偏移了,以為開(kāi)關(guān)控件的父控件是redView,所以redView的內(nèi)容View發(fā)生偏移,控件的位置也會(huì)發(fā)生偏移;
本章總結(jié):
到底在什么時(shí)候選用frame,什么時(shí)候選用bounds了?我覺(jué)得如果只是單純的修改控件的位置,那么我建議用frame.因?yàn)槿绻鹒rame和bouns同時(shí)變,會(huì)導(dǎo)致后面運(yùn)行的時(shí)候得不到自己想要的效果,這種問(wèn)題是很難發(fā)現(xiàn)的,所以我建議注意變量唯一原則,這樣更好的利于我們開(kāi)發(fā).
當(dāng)然也有例外得控件,比如UIScrollView,UITableView,UIWebView他們就是個(gè)例外,他們的bouns可能會(huì)變化的比較頻繁.如有興趣,請(qǐng)關(guān)注下節(jié)文章bounds和frame的探究(三);