transform矩陣計算原理:
http://www.itdecent.cn/p/6b799eeee8dd
https://www.cnblogs.com/delonchen/archive/2011/08/03/iostransform.html
ad對應(yīng)縮放,bc對應(yīng)旋轉(zhuǎn),tx,ty對應(yīng)位移
大部分的教程說,公式可以總結(jié)為
x = ax+cy+tx
y = bx+dy+ty
transform可以辦到控件的平移,旋轉(zhuǎn),縮放。
每種效果都對應(yīng)著兩個方法
CGAffineTransform帶make與不帶make區(qū)別?
1.帶make相對的最原始的位置做形變操作(一般只用做一次形變)
2.不帶make是相對于指定的形變開始進行,相對于上一次操作(一般用于做多次形變.)
- (IBAction)transform:(id)sender {
[UIView animateWithDuration:0.5 animations:^{
//平移
/**
CGAffineTransform帶make與不帶make區(qū)別?
1.帶make相對的最原始的位置做形變操作.(一般只用做一次形變.)
不帶make是相對于指定的形變開始進行.
相對于上一次操作(一般用于做多次形變.)
*/
//self.imageV.transform = CGAffineTransformMakeTranslation(0, 300);
//self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, 0, 100);
// 清除平移,讓每次平移都是相對上一次的位置
//[pan setTranslation:CGPointZero inView:self.imageView];
//旋轉(zhuǎn)
//參數(shù):旋轉(zhuǎn)的角度(是弧度)
//self.imageV.transform = CGAffineTransformMakeRotation(M_PI);
///self.imageV.transform = CGAffineTransformRotate(self.imageV.transform, M_PI_2);
// 復(fù)位,只要想相對于上一次旋轉(zhuǎn)就復(fù)位
// [rotation setRotation:0];
//縮放
//縮放比例(1代表是原始大小.)
//self.imageV.transform = CGAffineTransformMakeScale(1.5, 1.5);
//self.imageV.transform = CGAffineTransformScale(self.imageV.transform, 1.5, 1.5);
self.imageV.transform = CGAffineTransformScale(self.imageV.transform, 0.8, 0.8);
// 復(fù)位,只要相當(dāng)于上一次的縮放
// [pinch setScale:1];
}];
}
使用transform實現(xiàn)屏幕上View隨手指移動,實現(xiàn)思路:
1、先要監(jiān)聽到view上面手指的Touch事件
2、獲取到手指Touch的當(dāng)前點和上一個點的坐標(biāo)(手指相對當(dāng)前view的坐標(biāo)),并算出水平方向和垂直方向的偏移;
3、使用transform屬性,實現(xiàn)view的平移
//當(dāng)觸摸移動時調(diào)用
//NSArray:集合里面存入的元素都是有序的
//NSArray:集合里面存入的元素都是無序的
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"%s",__func__);
//獲取UITouch對象
UITouch *touch = [touches anyObject];
//上一個點:prePoint
//當(dāng)前點:curPoint 手指在紅色view上面Touch的坐標(biāo)(根據(jù)控件本身來講的)
//獲取上一點
CGPoint preP = [touch previousLocationInView:self];
//獲取當(dāng)前點
CGPoint cur = [touch locationInView:self];
NSLog(@"preP = %@",NSStringFromCGPoint(preP));
NSLog(@"cur = %@",NSStringFromCGPoint(cur));
//x偏移量 = 當(dāng)前點.x – 上一個點的.x
CGFloat offsetX = cur.x - preP.x;
//y偏移量 = 當(dāng)前點.y – 上一個點的.y
CGFloat offsetY = cur.y - preP.y;
//讓當(dāng)前View跟著手指移動
//Transform->平移
self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);
}
注意:UITouch對象,一根手指觸摸屏幕就會產(chǎn)生一個UITouch對象,單指操作,(NSSet<UITouch *> *)touches這個集合中只會有一個UITouch對象