一、iOS 仿射变换CGAffineTransform详解
IOS开发UI篇--仿射变换(CGAffineTransform)使用小结
iOS 仿射变换CGAffineTransform
1、UIView有CGAffineTransform类型的属性transform,它是定义在二维空间上完成View的平移,旋转,缩放等效果的实现.
//初始化, CGAffineTransformIdentity是系统提供的一个常量,/* The identity transform: [ 1 0 0 1 0 0 ]. */(和原图一样的transform);
CGAffineTransform transform = CGAffineTransformIdentity;
2、一个 view的 transform 属性对应一个 CGAffineTransform类的 3x3 矩阵(线性代数中的概念)。所有的变换都是以这个 view的 center做基准的。
创建一个CGAffineTransform:CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty),其中
a表示水方向的缩放
tx表示水平方向的偏移
d表示垂直方向的缩放,
ty表示垂直方向的偏移
如果 b、c不为 0 的话,那么肯定发生了旋转。
平移###
根据本身的transform进行平移 CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)
根据本身的 transform 另外的transform进行平移CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)
缩放###
根据本身的transform进行缩放 CGAffineTransformMakeScale(CGFloat sx,CGFloat sy)
根据本身的transform后者另外的transform进行缩放CGAffineTransformScale(CGAffineTransform t,CGFloat sx,CGFloat sy)
旋转###
根据本身的transform进行旋转 CGAffineTransformMakeRotation(CGFloat angle)(angle 旋转的角度)
根据本身的transform后者另外的transform进行旋转 CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)
反向旋转###
CGAffineTransformInvert(CGAffineTransform t)
合并###
CGAffineTransformConcat(_ t1: CGAffineTransform, _ t2: CGAffineTransform) -> CGAffineTransform
应用仿射矩阵###
CGPointApplyAffineTransform 得到新的点
CGSizeApplyAffineTransform 得到新的size
CGRectApplyAffineTransform 得到新的rect
评测矩阵###
CGAffineTransformIsIdentity 是否是CGAffineTransformIsIdentity
CGAffineTransformEqualToTransform 看两个矩阵是否相等
1、UIGestureRecognizer是一个定义基本手势的抽象类,具体什么手势,在以下子类中包含
1)拍击UITapGestureRecognizer (任意次数的拍击)
2)向里或向外捏UIPinchGestureRecognizer (用于缩放)
3)摇动或者拖拽UIPanGestureRecognizer (拖动)
4)擦碰UISwipeGestureRecognizer (以任意方向)
5)旋转UIRotationGestureRecognizer (手指朝相反方向移动)
6)长按UILongPressGestureRecognizer (长按)
// 这些操作的目的都是用来修改UIView对象的frame,center,bounds属性,还有一个Transform属性。
2、UIView管理手势识别器的方法有:
– addGestureRecognizer:
– removeGestureRecognizer:
gestureRecognizers //property
– gestureRecognizerShouldBegin:
3、手势的处理
//panGesture自定义处理手势的方法
- (void)panGesture:(UIPanGestureRecognizer *)pan{
CGPoint translatedPoint = [pan translationInView:self.view];
CGFloat x = pan.view.center.x + translatedPoint.x;
CGFloat y = pan.view.center.y + translatedPoint.y;
CGPoint center = CGPointMake(x, y);
XLOG(@"center = %@",NSStringFromCGPoint(center));
//每次移动完,将移动量置为0,否则下次移动会加上这次移动量
[pan setTranslation:CGPointMake(0, 0) inView:self.view];
if (pan.state == UIGestureRecognizerStateEnded) {
// NSLog(@"pan.view == %f", pan.view.center.x);
}
//center超过显示范围
if (center.x < 0 || center.x > SCREEN_WIDTH - _imageView.qsWidth/2 ||
center.y < 0 || center.y > _funcBtnListView.qsTop - _imageView.qsHeight/2) {
return;
}
_imageView.center = center;
}
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
CGPoint translation = [gestureRecognizer translationInView:gestureRecognizer.view];
NSLog(@"translation == %f", translation.x);
// if (translation.x <= 0) { //只能右滑
// return NO;
// }
return YES;
}
网友评论