transform矩阵计算原理:
https://www.jianshu.com/p/6b799eeee8dd
https://www.cnblogs.com/delonchen/archive/2011/08/03/iostransform.html
ad对应缩放,bc对应旋转,tx,ty对应位移
大部分的教程说,公式可以总结为
x = ax+cy+tx
y = bx+dy+ty
transform可以办到控件的平移,旋转,缩放。
每种效果都对应着两个方法
CGAffineTransform带make与不带make区别?
1.带make相对的最原始的位置做形变操作(一般只用做一次形变)
2.不带make是相对于指定的形变开始进行,相对于上一次操作(一般用于做多次形变.)
- (IBAction)transform:(id)sender {
[UIView animateWithDuration:0.5 animations:^{
//平移
/**
CGAffineTransform带make与不带make区别?
1.带make相对的最原始的位置做形变操作.(一般只用做一次形变.)
不带make是相对于指定的形变开始进行.
相对于上一次操作(一般用于做多次形变.)
*/
//self.imageV.transform = CGAffineTransformMakeTranslation(0, 300);
//self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, 0, 100);
// 清除平移,让每次平移都是相对上一次的位置
//[pan setTranslation:CGPointZero inView:self.imageView];
//旋转
//参数:旋转的角度(是弧度)
//self.imageV.transform = CGAffineTransformMakeRotation(M_PI);
///self.imageV.transform = CGAffineTransformRotate(self.imageV.transform, M_PI_2);
// 复位,只要想相对于上一次旋转就复位
// [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);
// 复位,只要相当于上一次的缩放
// [pinch setScale:1];
}];
}
使用transform实现屏幕上View随手指移动,实现思路:
1、先要监听到view上面手指的Touch事件
2、获取到手指Touch的当前点和上一个点的坐标(手指相对当前view的坐标),并算出水平方向和垂直方向的偏移;
3、使用transform属性,实现view的平移
//当触摸移动时调用
//NSArray:集合里面存入的元素都是有序的
//NSArray:集合里面存入的元素都是无序的
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"%s",__func__);
//获取UITouch对象
UITouch *touch = [touches anyObject];
//上一个点:prePoint
//当前点:curPoint 手指在红色view上面Touch的坐标(根据控件本身来讲的)
//获取上一点
CGPoint preP = [touch previousLocationInView:self];
//获取当前点
CGPoint cur = [touch locationInView:self];
NSLog(@"preP = %@",NSStringFromCGPoint(preP));
NSLog(@"cur = %@",NSStringFromCGPoint(cur));
//x偏移量 = 当前点.x – 上一个点的.x
CGFloat offsetX = cur.x - preP.x;
//y偏移量 = 当前点.y – 上一个点的.y
CGFloat offsetY = cur.y - preP.y;
//让当前View跟着手指移动
//Transform->平移
self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);
}
注意:UITouch
对象,一根手指触摸屏幕就会产生一个UITouch
对象,单指操作,(NSSet<UITouch *> *)touches
这个集合中只会有一个UITouch
对象
网友评论