iOS開發(fā)UIView的transform屬性詳解
本文主要是詳解iOS開發(fā)UIView的transform屬性,更多IOS技術(shù)知識(shí)邑闲,請登陸瘋狂軟件教育官網(wǎng)。加微信號(hào)瘋狂軟件,或者用微信搜索瘋狂軟件性芬,參加2015年優(yōu)惠活動(dòng)居兆,有機(jī)會(huì)獲得優(yōu)惠劵和代金劵。UIView的transform屬性
CGAffineTransform實(shí)際上是一個(gè)矩陣
| a,? b,? 0 |
| c,? d,? 0 |
| tx, ty, 1 |
a={1,1} b={1,2} c={2,1} d={2,2} tx={3,1} ty={3,2}
這個(gè)矩陣是用來標(biāo)記這個(gè)View的變化感混,可以是旋轉(zhuǎn)端幼,縮放,平移弧满。
也就是說婆跑,View的坐標(biāo)為 {x,y},變化后的坐標(biāo)是{x',y'}
.
| a,? b,0|
{x',y',1}={x,y,1} x | c,? d,0|
| tx, ty,1|
http://developer.apple.com/library/io...這個(gè)是官方文檔庭呜,里邊有諸多方法可以方便的創(chuàng)建這個(gè)矩陣
transform是view的一個(gè)重要屬性,它在矩陣層面上改變view的顯狀態(tài),能實(shí)現(xiàn)view的縮放滑进、旋轉(zhuǎn)、平移等功能募谎。transform是CGAffineTransform類型的扶关。使用transform后view的frame被真實(shí)改變的。
struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};
transform詳解
在view可以看做有很多像素塊構(gòu)成数冬,可以用(x,y)代表一個(gè)像素塊节槐,x為寬,y為高。transform就是改變每個(gè)像素塊的形狀铜异。在運(yùn)算過程中哥倔,[x,y,1]表示原來的像素塊,而新的像素塊[xn,yn,1]是由[x,y,1]乘以矩陣
{
a, b, 0
c, d, 0
tx,ty,1
}生成的揍庄∨剌铮化簡矩陣相乘,公式為
xn=ax+cy+tx;
yn=bx+dy+ty;
這個(gè)矩陣的第三列是固定的币绩,所以每次變換時(shí)蜡秽,只需傳入前兩列的六個(gè)參數(shù)[a,b,c,d,tx,ty]即可。
在CGAffineTransform的生成函數(shù)中缆镣,大多是兩兩對(duì)應(yīng)的芽突,一個(gè)帶make字樣,一個(gè)沒有董瞻。帶make字樣的是直接生成一個(gè)新的CGAffineTransform寞蚌,沒有make字樣的則是在一個(gè)CGAffineTransform的基礎(chǔ)上生成新的。
函數(shù)返回值均是CGAffineTransform類型钠糊。
//實(shí)現(xiàn)的是放大和縮小挟秤,在原來transform的基礎(chǔ)上生成一個(gè)新的transform。生成新的transform相當(dāng)于將t' = [sx抄伍,0艘刚,0,sy截珍,0攀甚,0]這六個(gè)參數(shù)代入矩陣中。則矩陣為[
sx,0 ,0
0 ,sy,0
0 ,0 ,1
];代入公式中岗喉,xn=(sx)*x,yn=(sy)*y秋度。所以sx,sy分別代表x軸與y軸上的放大倍數(shù)。
CGAffineTransformScale(CGAffineTransform t,
CGFloat sx, CGFloat sy);
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy);
//實(shí)現(xiàn)的是旋轉(zhuǎn)钱床。angle為角度荚斯,angle=π則旋轉(zhuǎn)180度。矩陣的六個(gè)參數(shù)為t' = [ cos(angle)查牌,sin(angle)事期,-sin(angle),cos(angle) 0纸颜,0];
CGAffineTransformRotate(CGAffineTransform t,
CGFloat angle)
CGAffineTransformMakeRotation(CGFloat angle);
//實(shí)現(xiàn)的是平移刑赶,矩陣的六個(gè)參數(shù)為t' = [1,0懂衩,0,1,tx浊洞,ty] ;代入公式牵敷,xn=x+tx,yn=y+ty。
CGAffineTransformTranslate(CGAffineTransform t,
CGFloat tx, CGFloat ty);
CGAffineTransformMakeTranslation(CGFloat tx,
CGFloat ty);
[objc]view plaincopy
1//旋轉(zhuǎn)
2-?(IBAction)rotationButtonPressed:(id)sender
3{
4self.imageView.transform?=?CGAffineTransformRotate(self.imageView.transform,?M_PI_4);
5}
6//縮放
7-?(IBAction)scaleButtonPressed:(id)sender
8{
9self.imageView.transform?=?CGAffineTransformScale(self.imageView.transform,?0.9,?0.9);
10}
11
12-?(IBAction)moveButtonPressed:(id)sender
13{
14_imageView.transform?=?CGAffineTransformTranslate(self.imageView.transform,?0,?10);
15}
?獲得CGAffineTransform有多種方法法希,例如使用CGAffineTransformMake枷餐,但是對(duì)于矩陣操作相對(duì)比較麻煩,事實(shí)上iOS已經(jīng)為我們準(zhǔn)備好了三個(gè)方法:CGAffineTransformMakeRotation(旋轉(zhuǎn))苫亦、CGAffineTransformMakeScale(縮放)毛肋、CGAffineTransformMakeTranslation(移動(dòng));
? transform進(jìn)行旋轉(zhuǎn)屋剑、縮放润匙、移動(dòng)的時(shí)候不是在原來的基礎(chǔ)上增量形變的,因此如果需要持續(xù)在原來的基礎(chǔ)上旋轉(zhuǎn)唉匾、縮放孕讳、移動(dòng)那么每次需要在原來的基礎(chǔ)上增加或減少。當(dāng)然巍膘,我們可以定義一個(gè)全局變量進(jìn)行累加厂财,但是事實(shí)上iOS已經(jīng)為我們提供好了三個(gè)對(duì)應(yīng)的方法,分別用于在原來的角度峡懈、縮放璃饱、移動(dòng)位置的基礎(chǔ)上做出修改:CGAffineTransformRotate、CGAffineTransformScale肪康、CGAffineTransformTranslate荚恶;