前言:學(xué)習(xí)ios開發(fā)有一段時間了,項目也做了兩個了棍厂,今天看視頻望侈,突然發(fā)現(xiàn)view的frame和bound兩個屬性,發(fā)現(xiàn)bound怎么也想不明白勋桶,好像饒你了死胡同里,經(jīng)過一番嘗試和思考侥猬,終于弄明白bound的含義例驹。
一、首先列一下公認的資料:
先看到下面的代碼你肯定就明白了一些:
-(CGRect)frame{
returnCGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
}
-(CGRect)bounds{
returnCGRectMake(0,0,self.frame.size.width,self.frame.size.height);
}
很明顯退唠,bounds的原點是(0,0)點(就是view本身的坐標系統(tǒng)鹃锈,默認永遠都是0炕柔,0點蚯根,除非認為setbounds)弊决,而frame的原點卻是任意的(相對于父視圖中的坐標位置)拜英。再來看張圖就明白了,
frame: 該view在父view坐標系統(tǒng)中的位置和大小盆驹。(參照點是圆丹,父親的坐標系統(tǒng))
bounds:該view在本地坐標系統(tǒng)中的位置和大小。(參照點是躯喇,本地坐標系統(tǒng)辫封,就相當(dāng)于ViewB自己的坐標系統(tǒng),以0,0點為起點)
center:該view的中心點在父view坐標系統(tǒng)中的位置和大小廉丽。(參照點是倦微,父親的坐標系統(tǒng))
我個人認為,bounds稍微有點費解正压,稍不留神欣福,想的多了,就會繞進去焦履。每個view都有一個本地坐標系統(tǒng)拓劝。這個坐標系統(tǒng)作用比較重要,比如觸 摸的回調(diào)函數(shù)中的UITouch里面的>坐標值都是參照這個本地坐標系統(tǒng)的坐標裁良。當(dāng)然bounds這個屬性也是參照這個本地坐標系統(tǒng)來的凿将。其實本地 坐標系統(tǒng)的關(guān)鍵就是要知道的它的原點(0,0)在什么位置(這個位置又是相對于上層的view的本地坐標系統(tǒng)而言的价脾,當(dāng)然最上面的一層view就是 window它的本地坐標系統(tǒng)原點就是屏幕的左上角了)牧抵。通過修改view的bounds屬性可以修改本地坐標系統(tǒng)的原點位置。
所以侨把,我個人認為犀变,bounds影響到子view的位置和大小。
二秋柄、demo演示
UIView*view1=[[UIViewalloc]initWithFrame:CGRectMake(20,20,280,250)];
[view1 setBounds:CGRectMake(-20,-20,280,250)];
view1.backgroundColor=[UIColorredColor];
[self.view addSubview:view1];//添加到self.view
NSLog(@"view1 frame:%@========view1 bounds:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds));
UIView*view2=[[UIViewalloc]initWithFrame:CGRectMake(0,0,100,100)];
view2.backgroundColor=[UIColoryellowColor];
[view1 addSubview:view2];//添加到view1上,[此時view1坐標系左上角起點為(-20,-20)]
NSLog(@"view2 frame:%@========view2 bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));
(運行展示获枝,圖中說的很明白了哦)
(log輸出日志表明,每個新的view默認的bounds其實都是(0,0))