iOS中照弥,大家肯定對view和frame都不陌生红碑,我們設(shè)置view在父view中的位置和大小時,只需要設(shè)置frame就可以了绰上。
可能大家也有查過網(wǎng)上的一些資料旨怠,可能也會得知frame是相對于superview坐標系的,而bounds則相對于view自身的坐標系蜈块,但是frame究竟是怎樣表示坐標的呢鉴腻,其實這就和bounds有關(guān)了。
值得肯定的是frame.size 和bounds.size 肯定一樣百揭,但是UIView中爽哎,frame其實是不存儲的,而是動態(tài)計算的器一,改變center课锌,改變bounds大小,或者改變transfrom都可能會導致frame的改變祈秕。
UIView的frame是一個動態(tài)的,官方文檔中有提到
// animatable. do not use frame if view is transformed since it will not correctly reflect the actual location of the view. use bounds + center instead.
@property(nonatomic) CGRect frame;
大意是說渺贤,如果我們的view有transform,則frame不能反映其在父view中的實際位置请毛,需要用bounds+center來反映志鞍。
假定我們的view沒有transform。 每次我們設(shè)置frame時方仿,則系統(tǒng)首先會設(shè)置
bounds.origin = 0,0
bounds.size = frame.size
然后會繼續(xù)設(shè)置
center.x = frame.origin.x + frame.size.width / 2
center.y = frame.origin.y + frame.size.height / 2
也就是說 設(shè)置frame時固棚,我們的bounds和center都會發(fā)生變化,但是view的位置是由center和bounds共同決定的仙蚜,完全可以不依賴于frame此洲。
每次我們訪問frame時,其實也是通過center和bounds計算委粉。
frame.size = bounds.size
frame.origin.x = center.x - bounds.size.width / 2
frame.origin.y = center.y - bounds.size.height / 2
當然期間如果有transform呜师,則會考慮到transfrom,比如大小縮小到0.9倍艳丛,則center不變匣掸,frame.size 變?yōu)?0.9倍,origin也會跟著變氮双。 transform不會影響到view的bounds和center,但是會影響到frame霎匈。